Transact-SQLで動的にSQLを編集してカーソルを使用する

プログラミング SQL Server

2時間もハマったのでメモ書きとして記述します。

Transact-SQLで動的にSQLを編集してSETでカーソルを定義するとエラーになります。

--動的にSQLを編集する
SET @wkSQL = 'SELECT '
SET @wkSQL = @wkSQL + ' col_name1 AS col_name1 '
SET @wkSQL = @wkSQL + ',col_name2 AS col_name2 '
SET @wkSQL = @wkSQL + 'FROM ' + @table_name  + ' '
SET @wkSQL = @wkSQL + 'WHERE ' + @where_str + ' '
SET @wkSQL = @wkSQL + 'ORDER BY col_name1 '

SET @CrsrVar = Cursor For @wkSQL

SET @CrsrVar = Cursor For @wkSQL

でエラーになります。

正しくカーソルで使用できるようにするには以下の通り「EXECUTE」を使用して行います。

DECLARE @wkSQL   [VARCHAR](1024)
DECLARE @col1    [VARCHAR](512)
DECLARE @col2    [VARCHAR](512)

--動的にSQLを編集する
SET @wkSQL = 'SELECT '
SET @wkSQL = @wkSQL + ' col_name1 AS col_name1 '
SET @wkSQL = @wkSQL + ',col_name2 AS col_name2 '
SET @wkSQL = @wkSQL + 'FROM ' + @table_name  + ' '
SET @wkSQL = @wkSQL + 'WHERE ' + @where_str + ' '
SET @wkSQL = @wkSQL + 'ORDER BY col_name1 '

--動的SQLでカーソルオープン
EXECUTE( 'DECLARE CrsrVar CURSOR FOR ' + @wkSQL )

--カーソルオープン
OPEN CrsrVar

--フェッチ開始
FETCH NEXT FROM CrsrVar INTO @col1, @col2

--カーソルクローズ
CLOSE CrsrVar

--リソース開放
DEALLOCATE CrsrVar

これで正しくデータが取れました。

タイトルとURLをコピーしました