動的なSQLを生成する際、条件に日付を設定して実行するとSQLSERVER側が日付を認識しなく、SQLが実行出来なかった。
この記事で解決すること
この記事では文字列と日付型を連結させてSQLを実行する方法を紹介します。
日付と文字列を連結する際のコンマの指定方法を少し工夫してあげることで解決します。
解決方法
サンプルテーブル
テーブル名:TT
ID | EVENT | STARTYMD | ENDYMD
1 | 予定A | 2022/09/01 | 2022/09/05
2 | 予定B | 2022/08/05 | 2022/08/08
例題として、今日の日付がサンプルテーブル内STARTYMDからENDYMDの範囲内かどうかを判定するロジックにて日付と文字列を連結させてSQLを実行させてみます。
-- 今日の日付は2022/09/02であるとする
DECLARE @CURRENTYMD datetime;
SET @CURRENTYMD = GETDATE(); -- 現在の日付を取得する
-- 動的SQL生成
DECLARE @SQL nvarchar(max);
@
@SQL = N'SELECT @RETURNPARAM = COUNT(*) FROM TT';
@SQL = @SQL + N'WHERE STARTYMD <=''' + @ARGYMD + '''';
@SQL = @SQL + N'AND ENDYMD >=''' + @ARGYMD + '''';
@RETURNPARAM int
SET @PD = N'@level TINYINT, @RETURNP VARCHAR(30) OUTPUT';
EXECUTE sq_executesql
@SQL,
EXECUTE sp_executesql @SQLString, @PD, @ARGYMD = @CURRENTYMD, @RETURNP = @RETURNP OUTPUT;
-- 期間内かどうかの判定
IF(@RETURNP > 0)
BEGIN
PRINT('予定があります');
END
ELSE
BEGIN
PRINT('予定はありません');
END
以上です
コメント