存儲(chǔ)過程用sp_executesql執(zhí)行動(dòng)態(tài)SQL語句及獲得返回值
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
![]() ![]() 用sp_executesql執(zhí)行動(dòng)態(tài)SQL語句及獲得返回值過去我執(zhí)行拼湊出來的動(dòng)態(tài)SQL語句,都直接使用EXEC @sql 的方式。有好幾次,都看到有資料說,應(yīng)該盡量使用 sp_executesql。 究其原因,是因?yàn)閮H僅參數(shù)不同的情況下,sp_executesql可以重用執(zhí)行計(jì)劃,這不就有跟存儲(chǔ)過程一樣的優(yōu)勢(shì)了嗎?同時(shí),sp_executesql還可以提供動(dòng)態(tài)SQL語句執(zhí)行的返回值,方便得很。 但sp_executesql的使用方式看上去比較復(fù)雜,一點(diǎn)都不像EXEC那樣直觀。 用法: EXEC sp_executesql SQL語句,參數(shù)聲明,參數(shù) 如 CREATE TABLE #tmp(t INT NOT NULL,it DECIMAL(18,4),pt DECIMAL(18,4)); INSERT INTO #tmp(t,it,pt) VALUES(1,10.00,15.00); INSERT INTO #tmp(t,it,pt) VALUES(2,20.00,30.00); DECLARE @sql NVARCHAR(2000) = N'SELECT @it=it,@pt=pt FROM #tmp WHERE t=@tN;'; DECLARE @Param NVARCHAR(500) = N'@tN INT,@it DECIMAL(18,4) OUTPUT,@pt DECIMAL(18,4) OUTPUT'; DECLARE @tN INT,@it DECIMAL(18,4),@pt DECIMAL(18,4); SET @tN = 1; --@tN=@tN,第一個(gè)@tN是@Param里的聲明,而第二個(gè)@tN則是外部的聲明,其他類似 EXEC sp_executesql @sql,@Param,@tN=@tN,@it=@it OUTPUT,@pt=@pt OUTPUT; SELECT @it,@pt; DROP TABLE #tmp; 為什么有返回值那么重要呢?我在不知道這個(gè)用法以前,如果需要捕捉動(dòng)態(tài)SQL語句里的返回值,要借用表對(duì)象: 詳見拙作: http://blog.csdn.net/leftfist/article/details/12840785 declare @sql NVARCHAR(MAX) = N'SELECT @i,@j;'; declare @paramdefine NVARCHAR(MAX) = N'@i INT,@j INT,@k INT=3'; exec sp_executesql @sql,@paramdefine,@i=1,@j=2; 該文章在 2024/6/27 9:38:03 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |