【SQLServer】カーソル使い方まとめ

カーソルを使うことでSELECT文で抽出したレコード群から、
1行毎に値を使用してループ処理を行うことができます。
複雑な処理をしたい場合に非常に便利です。文例を基に説明します。

テストテーブル作成

SQL
--テストテーブル作成
create table #test
(
	[number1] int,
	[number2] int
)

--テストデータ挿入
insert into 
	#test 
values	
	(3,5),
	(4,2),
	(5,10)
SQL

カーソル実行

SQL
--変数定義
DECLARE @cur CURSOR
DECLARE @number1 int
DECLARE @number2 int

--カーソルオープン
SET @cur = CURSOR FOR SELECT [number1],[number2] from #test
OPEN @cur

--1レコード目セット
FETCH NEXT FROM @cur INTO @number1,@number2

--ループ開始
WHILE( @@FETCH_STATUS = 0 )
BEGIN
	--処理
	print @number1 * @number2
	
	--次レコード
	FETCH NEXT FROM @cur INTO @number1,@number2
END
  
--カーソルクローズ
CLOSE @cur 
DEALLOCATE @cur
SQL

【変数定義】
・CURSOR型は固定で必須。
・残りはSELECT文で抽出する、ループ処理の中で使用したい値を格納するためのもの。
 今回は[number1][number2]をループ処理の中で使用するため、格納するための変数を用意した。


【カーソルオープン】
・ループを回すレコードを抽出するSELECT文を記述
・例文では使用していないが、where句も使用できる


【1レコード目セット】
・先頭の1レコード目のSELECT結果を変数に格納する


【ループ開始】
・WHILE( @@FETCH_STATUS = 0 )で、レコードがなくなるまでループの意味
・任意の処理を行った後に、FETCH NEXTで次のレコードへ


【カーソルクローズ】
・終了処理

【結果】
15
8
50