EXEC(@sql) 功能強但不支持參數,易導致 SQL 注入、計劃無法復用。sp_executesql 支持嵌入參數,實現參數化動態 SQL,兼具靈活與安全。
sp_executesql
@stmt = N'SQL 文本(含 @參數)',
@params = N'@參數1 類型1, @參數2 類型2, ...',
@參數1 = 值1, @參數2 = 值2, ...
@stmt:Unicode 常量/變量(N'...'),含 @參數名 佔位符。@params:參數定義列表,Unicode 字符串。OUTPUT。DECLARE @user VARCHAR(1000)
DECLARE @moTable VARCHAR(20)
SELECT @moTable = 'MT_10'
DECLARE @sql NVARCHAR(4000)
SET @sql = 'SELECT @user = COUNT(DISTINCT userid) FROM ' + @moTable
EXEC sp_executesql @sql,
N'@user VARCHAR(1000) OUTPUT', -- 參數定義:@user 為輸出
@user OUTPUT -- 綁定外部變量接收結果
PRINT @user
關鍵點:@moTable 為拼接進 SQL 的表名(無法參數化),@user 為真正參數化的輸出參數。
@stmt 必須為 Unicode (N'...'),不允許字符串拼接表達式(如 N'SELECT ' + @col)。sp_executesql 替代 EXEC()。