SQLServer動態的EXEC和sp_executesql用法的區別

分享兩種執行動態的sql語句命令,分別是EXEC和sp_executesql、sp_executesql更有優勢提供了輸入輸出接口,而EXEC沒有,並且sp_executesql還可以重寫執行計劃,這樣大大的提高了執行性能,還可以編寫更安全的代碼。

1.Exec的用法

     兩種命令   執行存儲過程和執行動態批處理

DECLARE @exesql nvarchar(1000),@id nvarchar(100)
set @id='1';
set @exesql='select * from dbo.tb_UserInfo where id='+@id
exec(@exesql)

exec括號中只允許包含一個字符串變量但是可以串聯多個變量例如(exec(@sql1+@sql2))

exec 沒執行一次都要產生一次編譯,執行計劃沒有得到充分重寫

exec除了不支持動態處理中輸入參數外,也不支持輸出參數,默認情況下exec把查詢輸出返回值給調用者,例如下面返回表中所有記錄條數

DECLARE @exesql nvarchar(1000),@id nvarchar(100),@pageCount
set @id='1';
set @exesql='select  count(*)  from dbo.tb_UserInfo where id='+@id
exec(@exesql)

CREATE TABLE #T(TID INT); 

INSERT INTO #T EXEC(@sql); 

SET @pageCount= (SELECT TID FROM #T)

SELECT @pageCount

DROP TABLE #T

 

 

2.sp_executesql的使用

 

DECLARE @exesql nvarchar(1000),@id nvarchar(100)
set @id='1';
set @exesql='select * from dbo.tb_UserInfo where id='+@id
exec sp_executesql  @exesql     //修改此處

 

sp_executesql 提供接口

sp_executesql
命令比EXEC命令更靈活,因爲它提供一個接口,該接口及支持輸入參數也支持輸出參數。這功能使你可以創建帶參數的查詢 字符串,
這樣就可以比EXEC更好的重用執行計劃,sp_executesql的構成與存儲過程非常相似,不同之處在於你是動態構建代碼。它的構成包括:
代碼快,參數聲明部分,參數賦值部分。說了這麼多,還是看看它的語法吧
 
EXEC sp_executesql 
@stmt = <statement>,--類似存儲過程主體
 
@params = < params>, --類似存儲過程參數部分
 
< params assignment> --類似存儲過程調用
 
@stmt
參數是輸入的動態批處理,它可以引入輸入參數或輸出參數,和存儲過程的主體語句一樣,只不過它是動態的,而存儲過程是靜態的,不過你也可以在存儲過程中使用
sp_executesql; 
@params
參數與定義輸入/
輸出參數的存儲過程頭類似,實際上和存儲過程頭的語法完全一樣;
 
@ 與調用存儲過程的EXEC部分類似。

 

 

 

DBCC FREEPROCCACHE   情況緩存中的執行計劃

 

 

3.參數賦值

delacre @sqlWhere nvarchar(1000)

 

@sqlWhere='where 1=1'  這樣變量不需要初始化

@sqlWhere +='and  2=2'   追加賦值變量需要初始化

 

 

 

 

 

 

發佈了35 篇原創文章 · 獲贊 8 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章