内容は、モード(日,月,年)と期間を与えると、システム日付から、その指定期間先の日付を表示する・・・というだけのものですが、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は、あくまでも軽い個人用途程度のものですが、今のところ何の問題も発生してなくて快適に使えています。