通常執行sql語句,大家用的都是exec,exec功能強大,但不支援嵌入參數,sp_executesql解決了這個問題。抄一段sqlserver協助:
sp_executesql
執行可以多次重用或動態產生的 Transact-SQL 陳述式或批處理。Transact-SQL 陳述式或批處理可以包含嵌入參數。
文法
sp_executesql [@stmt =] stmt
[
{, [@params =] N'@parameter_name data_type [,...n]' }
{, [@param1 =] 'value1' [,...n] }
]
參數
[@stmt =] stmt
包含 Transact-SQL 陳述式或批處理的 Unicode 字串,stmt 必須是可以隱式轉換為 ntext 的 Unicode 常量或變數。不允許使用更複雜的 Unicode 運算式(例如使用 + 運算子串聯兩個字串)。不允許使用字元常量。如果指定常量,則必須使用 N 作為首碼。例如,Unicode 常量 N'sp_who' 是有效,但是字元常量 'sp_who' 則無效。字串的大小僅受可用資料庫伺服器記憶體限制。
stmt 可以包含與變數名形式相同的參數,例如:
N'SELECT * FROM Employees WHERE EmployeeID = @IDParameter'
stmt 中包含的每個參數在 @params 參數定義列表和參數值列表中均必須有對應項。
[@params =] N'@parameter_name data_type [,...n]'
字串,其中包含已嵌入到 stmt 中的所有參數的定義。該字串必須是可以隱式轉換為 ntext 的 Unicode 常量或變數。每個參數定義均由參數名和資料類型組成。n 是表明附加參數定義的預留位置。stmt 中指定的每個參數都必須在 @params 中定義。如果 stmt 中的 Transact-SQL 陳述式或批處理不包含參數,則不需要 @params。該參數的預設值為 NULL。
[@param1 =] 'value1'
參數字串中定義的第一個參數的值。該值可以是常量或變數。必須為 stmt 中包含的每個參數提供參數值。如果 stmt 中包含的 Transact-SQL 陳述式或批處理沒有參數,則不需要值。
n
附加參數的值的預留位置。這些值只能是常量或變數,而不能是更複雜的運算式,例如函數或使用運算子產生的運算式。
傳回碼值
0(成功)或 1(失敗)
結果集
從產生 SQL 字串的所有 SQL 陳述式返回結果集。
例子(感謝閩南交易網提供)
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 --為變數賦值
--執行@sql中的語句 exec sp_executesql @sql ,N'@user varchar(1000) out' --表示@sql中的語句包含了一個輸出參數 ,@user out --和調用預存程序差不多,指定輸出參數值 print @user
|
本例中,@moTable 為嵌入參數。