DECLARE @TransactorID INT;
SET @TransactorID = 0;
PRINT @TransactorID; -- 0
-- 關鍵:參數聲明加 OUTPUT,調用時加 OUTPUT
EXEC sp_executesql
N'SELECT @TransactorID = 5', -- 動態 SQL
N'@TransactorID INT OUTPUT', -- 參數定義 (注意 OUTPUT)
@TransactorID OUTPUT; -- 變量綁定 (注意 OUTPUT)
PRINT @TransactorID; -- 5
@TransactorID INT OUTPUT@TransactorID OUTPUTSELECT @TransactorID = 5 (隱含輸出)DECLARE @id INT;
EXEC('SELECT @id = 10'); -- 錯誤:動態作用域變量不共享
PRINT @id; -- 仍為 NULL/0
EXEC() 创建新會話上下文,變量隔離。sp_executesql 支持參數化輸入輸出,共享調用者上下文。
CREATE PROC GetCountByDynamicFilter
@TableName SYSNAME,
@Filter NVARCHAR(MAX),
@RowCount INT OUTPUT
AS
BEGIN
DECLARE @SQL NVARCHAR(MAX) =
N'SELECT @RowCount = COUNT(*) FROM ' + QUOTENAME(@TableName) +
N' WHERE ' + @Filter;
EXEC sp_executesql @SQL,
N'@RowCount INT OUTPUT',
@RowCount OUTPUT;
END
-- 調用
DECLARE @cnt INT;
EXEC GetCountByDynamicFilter 'orders', 'status=1 AND amount>100', @cnt OUTPUT;
SELECT @cnt;
QUOTENAME() 防注入EXECUTE 權限,不給 DDL