spでexecutesql動的SQL文の実行と戻り値の取得

1306 ワード

過去に私がパッチワークした動的SQL文は、EXEC@sql方式を直接使用していました.何度も、sp_を使うべきだという資料を見たことがあります.executesql.
その原因は、パラメータが異なる場合のみ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;