1. 程式人生 > >執行動態 sql 併為 輸出引數賦值、sp_executesql 使用方法

執行動態 sql 併為 輸出引數賦值、sp_executesql 使用方法

sp_executesql  過程與 exec 關鍵字區別
sp_executesql  可以在動態 sql 中使用變數,並且將變數輸出
exec 則只能執行動態 sql 和 儲存過程(執行過程不需要加小括號,執行動態 sql 則必須加小括號)
----------------------------------------------------------------------------------

declare @count int
declare @sql1 nvarchar(100)
declare @sql2 nvarchar(100)
declare @str nvarchar(10)



--1 執行需要為變數賦值的動態 sql
set @str='1'
set @sql1='select @count1=COUNT(*) from Base_Product where [email protected]'
print @sql1-- 除錯資訊輸出
--注意:執行 sp_executesql 儲存過程不需要加 小括號 ,加了就報錯! 
EXECUTE sp_executesql
 @sql1,
 N'@count1 int output,@str1 varchar(10)',
 @count1 = @count output,@
[email protected]

select @count --檢視統計數


--2 執行普通動態 sql
set @sql2='select top 10 * from Base_Product'
print @sql2-- 除錯資訊輸出
EXECUTE (@sql2) --注意:這裡如果加小括號為執行 sql 語句,不加小括號預設為執行'儲存過程'


/*
對 sp_executesql 儲存過程做個說明
第一個引數:
很明顯是要執行的拼接後的 sql 語句了,其中@count1、@str1為佔位符,
為了測試所以選擇了一個int和一個nvarchar 型別做測試



第二個引數:
這個引數是對第一個引數中的‘佔位符’進行說明和定義用的
需要動態執行的指令碼: 'select @count1=COUNT(*) from Base_Product where [email protected]'
  對佔位符進行的說明: N'@count1 int output,@str1 varchar(10)'
  如果動態指令碼中有多個佔位符時,需要在說明字串中使用‘逗號’隔開,
  如果需要在執行‘動態sql’後得到其中引數的值,需要為其標註為 output,即 @count1 int output 


第三個引數到第N個引數:
  這個引數是對‘佔位符’中變數與實際變數繫結用的,
  如果在第二個引數中標記‘站位符’為 output ,這裡也需要進行一下標記
  即:@count1 = @count output
  (注意‘佔位符’中的變數名不需要加單引號)
  
sp_executesql 語法詳見: 
http://msdn.microsoft.com/zh-cn/library/ms188001.aspx
*/


/*轉載保留:http://write.blog.csdn.net/postedit/7648579