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.