2015年2月7日土曜日

Windows10 + SQL-Server2014 Expressで、簡単な動的クエリーをsp_executesqlで書いてみる

今回の記事では、Windows10 Technical Preview上のSQL-Server2014 Expressにて、簡単な動的クエリーを書いてみました。

内容は、モード(日,月,年)と期間を与えると、システム日付から、その指定期間先の日付を表示する・・・というだけのものですが、sp_executesqlを使って書いてみました。


--変数定義
DECLARE 
@SQL  NVARCHAR(MAX), --クエリー用
@PRM  NVARCHAR(MAX), --パラメータ用
@NOW  DATETIME,      --現在日時用
@RES  DATETIME,      --結果取得用
@MODE TINYINT,       --処理モード(1=月,2=日,その他=年)
@CNT  INT            --期間
--各種の入力値のセット
SET @NOW = GETDATE(); --現在時刻
SET @MODE = 2;        --モード(2=日単位)
SET @CNT  = 100;      --期間
--クエリーをセット
SET @SQL = N'SELECT @RES = DATEADD(' + 
CASE @MODE
WHEN 1 THEN N'm'
WHEN 2 THEN N'd'
ELSE N'y'
END + N',@CNT,@DT)';
--パラメータをセット
SET @PRM = N'@CNT INT, @DT DATETIME, @RES DATETIME output';
--動的クエリー実行
EXEC master.dbo.sp_executesql
@SQL, --クエリー
@PRM, --パラメータ
@CNT = @CNT,
@DT  = @NOW,
@RES = @RES output;
--結果表示
SELECT @NOW AS [開始値],@CNT AS [期間], @RES AS [結果];
動的クエリーというと、EXEC ('文字列') (たとえば、EXEC ('SELECT DATEADD(d,1,GETDATE())'); のような)という書き方も可能なのですが、もう推奨されないみたいですね。

sp_executesqlだと、パラメータが使えるので便利だし、outputで、結果を変数に戻して来られるのもまた便利です。

ただ、クエリー本文とパラメータ用の変数の型は、必ずnvarchar等のUNICODEタイプじゃないとエラーになってしまいます。

Windows10 + SQL-Server 2014 Expressは、あくまでも軽い個人用途程度のものですが、今のところ何の問題も発生してなくて快適に使えています。