分享兩種執行動態的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' 追加賦值變量需要初始化