T-SQL

Jak chytře na zápis volání sp_executesql?

sp_executesql známe a používáme všichni pro vykonání dynamicky generovaného T-SQL kódu. Viděl jsem již nejrůznější zápisy a jmenné konvence, které se zdály na první pohled nekomplikované a vyhovující, ale s narůstající složitostí kódu se více a více od ideálu vzdalovaly.

V průběhu let praxe jsem si oblíbil zápis níže, který rovnou řeší většinu skrytých problémů a pozdějších nepříjemností, a to zejména tím, že jasně odlišuje vstupní a výstupní dynamické parametry pomocí přípon IN a OUT od jejich bratříčků a hlavní linii kódu:

DECLARE @Stmt NVARCHAR(MAX)
DECLARE @Params NVARCHAR(500)

DECLARE @NoteId UNIQUEIDENTIFIER
DECLARE @NoteText VARCHAR(4000)
 
SET @NoteId = '475ACAB7-C19B-4CF6-A6E9-4B911C504419'

SET @Stmt = N'SELECT @NoteTextOUT = NoteText
                     FROM TESTDB.dbo.tblNote
                     WHERE Id = @NoteIdIN'
 
SET @Params = N'@NoteIdIN UNIQUEIDENTIFIER, @NoteTextOUT VARCHAR(4000) OUTPUT';
 
EXECUTE sp_executesql @Stmt, @Params, 
                      @NoteIdIN = @NoteId, 
                      @NoteTextOUT = @NoteText OUTPUT;

Samozřejmě, že si stále musíte pamatovat, na které straně (vlevo či vpravo) mají být dynamické a hlavní deklarované parametry, ale to už vyplývá ze samotné implementace sp_executesql procedury, která sama o sobě porušuje pravidla pro volání standardních uložených procedur tím, že pro část parametrů dovoluje jejich přímou deklaraci a pro další část (uživatelskou) jejich deklaraci jako hodnota = hodnota.

Leave a Reply

Your email address will not be published.