spでexecutesql動的SQL文の実行と戻り値の取得
1306 ワード
過去に私がパッチワークした動的SQL文は、EXEC@sql方式を直接使用していました.何度も、sp_を使うべきだという資料を見たことがあります.executesql.
その原因は、パラメータが異なる場合のみsp_executesqlは実行計画を再利用できるので、ストレージ・プロシージャと同じメリットがあるのではないでしょうか.同時にsp_executesqlはまた、動的SQL文の実行の戻り値を提供することができ、便利です.
でもsp_executesqlの使い方は複雑に見え、EXECのように直感的ではありません.
使い方:
EXEC sp_Excutesql SQL文、パラメータ宣言、パラメータ
如き
詳しくは拙作を参照:
http://blog.csdn.net/leftfist/article/details/12840785
その原因は、パラメータが異なる場合のみsp_executesqlは実行計画を再利用できるので、ストレージ・プロシージャと同じメリットがあるのではないでしょうか.同時にsp_executesqlはまた、動的SQL文の実行の戻り値を提供することができ、便利です.
でもsp_executesqlの使い方は複雑に見え、EXECのように直感的ではありません.
使い方:
EXEC sp_Excutesql SQL文、パラメータ宣言、パラメータ
如き
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, @tN @Param , @tN ,
EXEC sp_executesql @sql,@Param,@tN=@tN,@it=@it OUTPUT,@pt=@pt OUTPUT;
SELECT @it,@pt;
DROP TABLE #tmp;
なぜ戻り値がそんなに重要なのか.この使い方が分からない前に、動的SQL文の戻り値をキャプチャする必要がある場合は、テーブル・オブジェクトを借ります.詳しくは拙作を参照:
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;