ちょっと FETCH している箇所の意図が(私が)理解できていない気がするのですが、
sql
1--最初の1行目を取得して変数へ値をセット
2FETCH NEXT FROM CUR_AAA INTO @W_COL1,@W_COL2;
3FETCH NEXT FROM CUR_AAA INTO @W2_COL1,@W2_COL2;
上記では 1 つ目の FETCH で 「最初の 1 行目のデータ」、
その直後の FETCH で「2 行目のデータ」が取れるのではないかと思うのですが、これはそういう意図ですか?
そして WHILE の最後で FETCH している箇所では、
sql
1 --次の行のデータを取得して変数へ値をセット
2 FETCH NEXT FROM CUR_AAA INTO @W_COL1,@W_COL2;
3 FETCH NEXT FROM CUR_AAA INTO @W2_COL1,@W2_COL2;
最初の FETCH で「3 行目のデータ」、
その直後の FETCH で「4 行目のデータ」
が取れるような気がするのですが・・・
普通にカーソルで一行ずつ取得する場合、WHILE の前で FETCH 1 回、WHILE の最後で FETCH 1 回とするように思うのですが、まずここについてどうでしょうか。
(@W2_COL1, @W2_COL2 がいらないのでは?と思ったのですが)
そして、本題の「配列を使いたい」というのはどの部分に関してでしょうか。
『 ここでSELECT文発行(略) 』 の結果を配列に入れたい、ということでしょうか?
それとも前述のカーソルの扱いについて何か問題があったのでしょうか。
追記
IF分の中でさらにSELECT文を発行し、WHERE句として使用する
この SELECT したものは何に使うのでしょうか。PRINT で確認するだけ?
FETCH したものをそのまま判定に使ったり WHERE句 で指定したりするだけなら
配列に詰めないで WHILE の中でそのまま処理を書いてしまえば良い気もしますが。
以下 コピペで動くはず・・・
(2つ目のSELECTは適当です)
(TAB_A, TAB_B はテスト実行用にサブクエリを書いていますが、実際には普通にテーブルを指定すれば良いです)
sql
1BEGIN
2 --カーソルの値を取得する変数宣言
3 DECLARE @W_COL1 varchar(50)
4 DECLARE @W_COL2 decimal(18,0)
5
6 --2つ目の SELECT の結果を入れる変数
7 DECLARE @W_HOGE varchar(100)
8
9 --カーソル定義
10 DECLARE CUR_AAA CURSOR LOCAL FOR
11 SELECT COL1, COL2
12 FROM (
13 SELECT 'aaa' AS COL1, CONVERT(decimal, 100) AS COL2 UNION ALL
14 SELECT 'bbb' AS COL1, CONVERT(decimal, 200) AS COL2 UNION ALL
15 SELECT 'ccc' AS COL1, CONVERT(decimal, 300) AS COL2 UNION ALL
16 SELECT 'aaa' AS COL1, CONVERT(decimal, 10) AS COL2 UNION ALL
17 SELECT 'aaa' AS COL1, CONVERT(decimal, 20) AS COL2
18 ) TAB_A
19 WHERE TAB_A.COL1 IN ('aaa', 'ccc')
20
21 --カーソルオープン
22 OPEN CUR_AAA;
23
24 --最初の1行目を取得して変数へ値をセット
25 FETCH NEXT FROM CUR_AAA INTO @W_COL1,@W_COL2;
26
27 --データの行数分ループ処理を実行する
28 WHILE @@FETCH_STATUS = 0
29 BEGIN
30
31 -- 確認用
32 PRINT 'FETCHしたもの:[' + @W_COL1 + '] [' + CONVERT(varchar, @W_COL2) + ']'
33
34 -- ★FETCH した値を判定条件に使用
35 IF @W_COL1 = 'aaa'
36 BEGIN
37 -- FETCH した値を元に別テーブルを SELECT
38 SELECT @W_HOGE = Hoge
39 FROM (
40 SELECT 'aaa' AS COL1, CONVERT(decimal, 100) AS COL2, 'hoge1' AS Hoge UNION ALL
41 SELECT 'bbb' AS COL1, CONVERT(decimal, 200) AS COL2, 'hoge2' AS Hoge UNION ALL
42 SELECT 'ccc' AS COL1, CONVERT(decimal, 300) AS COL2, 'hoge3' AS Hoge UNION ALL
43 SELECT 'aaa' AS COL1, CONVERT(decimal, 10) AS COL2, 'hoge4' AS Hoge UNION ALL
44 SELECT 'aaa' AS COL1, CONVERT(decimal, 20) AS COL2, 'hoge5' AS Hoge
45 ) TAB_B
46 WHERE TAB_B.COL1 = @W_COL1 --★WHERE句に使用
47 AND TAB_B.COL2 = @W_COL2 --★WHERE句に使用
48
49 -- 確認用
50 PRINT 'Hoge[' + @W_HOGE + ']'
51 END
52 ELSE
53 BEGIN
54 -- 確認用
55 PRINT '2つ目のSELECTは実行しません'
56 END
57
58 PRINT '----------'
59
60 --次の行のデータを取得して変数へ値をセット
61 FETCH NEXT FROM CUR_AAA INTO @W_COL1,@W_COL2;
62 END
63
64 --カーソルを閉じる
65 CLOSE CUR_AAA;
66 DEALLOCATE CUR_AAA;
67
68END
参考までに。