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.
