首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

sp_executesql 參數化動態 SQL 完全指南:告別 EXEC 拼接字符串

     編輯:關於SqlServer

為什麼用 sp_executesql?

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 為真正參數化的輸出參數。

優勢總結

  1. 計劃復用:相同參數化模板重複執行復用編譯計劃。
  2. 防注入:參數值不參與 SQL 解析。
  3. 類型安全:參數強類型定義。
  4. 輸出參數:直接接收標量結果,無需臨時表/游標。

注意事項

  • @stmt 必須為 Unicode (N'...'),不允許字符串拼接表達式(如 N'SELECT ' + @col)。
  • 參數值只能是常量/變量,不能是函數/運算式。
  • SQL Server 2005+ 推薦優先使用 sp_executesql 替代 EXEC()。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved