質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Transact-SQL

Transact-SQLはSybase ASEとMIcrosoft SQLサーバで対応されているSQLの機能拡張版です。

Q&A

解決済

1回答

2735閲覧

T-SQL:カーソル文で2行分の結果を変数に格納する方法

dera

総合スコア28

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Transact-SQL

Transact-SQLはSybase ASEとMIcrosoft SQLサーバで対応されているSQLの機能拡張版です。

0グッド

1クリップ

投稿2018/01/15 00:54

初めまして。T-SQLのカーソル文について質問です。

T-SQLのカーソル文はSELECTした結果を1行ずつ取り出し、
対応した変数に格納することができると思いますが、
SELECTした結果が2行あり2行分のデータを変数に格納するには
どうすればよろしいでしょうか?

例を示しますが、
FETCH NEXT~のところからINTOで変数にセットしていますが、
これだと1行分のデータを変数にセットして1行ずつ処理をしていると
考えます。そうではなくて、
ここで2行分入れてからそれを基に判定処理を作成したいと考えております。

SQL-Serverは2014年のものを使用しております。

皆様の力をお貸しください。よろしくお願いいたします。

T

1--カーソルの値を取得する変数宣言 2DECLARE @W_COL1 varchar(50) 3DECLARE @W_COL2 decimal(18,0) 4 5--カーソル定義 6DECLARE CUR_AAA CURSOR FOR 7 SELECT COL1 8 ,COL2 9 FROM TAB_A 10 WHERE TAB_A.COL1 = <条件値> 11 12--カーソルオープン 13OPEN CUR_AAA; 14 15--最初の1行目を取得して変数へ値をセット 16FETCH NEXT FROM CUR_AAA 17INTO @W_COL1,@W_COL2; 18 19--データの行数分ループ処理を実行する 20WHILE @@FETCH_STATUS = 0 21BEGIN 22 23 -- ========= ループ内の実際の処理 ここから=== 24 25 INSERT INTO TAB_B 26 VALUES ( 27 @W_COL1 28 ,@W_COL2 29 ) 30 31 -- ========= ループ内の実際の処理 ここまで=== 32 33 34 --次の行のデータを取得して変数へ値をセット 35 FETCH NEXT FROM CUR_AAA 36 INTO @W_COL1,@W_COL2; 37 38END 39 40--カーソルを閉じる 41CLOSE CUR_AAA; 42DEALLOCATE CUR_AAA;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

fetch nextを2回すればいいと思うのですがダメでしたか?

sql

1--カーソルの値を取得する変数宣言1 2DECLARE @W1_COL1 varchar(50) 3DECLARE @W1_COL2 decimal(18,0) 4--カーソルの値を取得する変数宣言2 5DECLARE @W2_COL1 varchar(50) 6DECLARE @W2_COL2 decimal(18,0) 7 8-- ~~~~省略~~~~ 9 10--最初の1行目を取得して変数へ値をセット 11FETCH NEXT FROM CUR_AAA 12INTO @W1_COL1,@W1_COL2; 13--次を取得して変数へ値をセット 14FETCH NEXT FROM CUR_AAA 15INTO @W2_COL1,@W2_COL2; 16 17-- ~~~省略~~~~

直接関係ありませんがカーソルのselect文にorderbyが無いのは良くないです。

投稿2018/01/15 01:11

sousuke

総合スコア3828

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dera

2018/01/15 01:35

FETCH NEXTを2回試したところ、 2行分の値を格納することができました。ありがとうございます。 ただ、カーソルのSELECT文にORDER BYがないといけない理由が考えてもわかりませんでした。どういった時に影響を及ぼすのでしょうか?
sousuke

2018/01/15 01:59

orderbyが指定されていれば「次はこれです」とデータベースが論理的に説明できます。 orderbyがない現状だとsqlserverのオプティマイザが自動選択するindexに結果が左右され 「思った通りの順番でデータが来ない」可能性があります。データベースは開発者の心情を汲み取っては くれないので並んでほしい順番があるのならorderbyは必須です。 orderbyを指定していない場合「並び順はどうでもいいですよ」とデータベースに伝えているいうことです。
dera

2018/01/15 02:06

そういうことでしたか。確かに、ORDER BY句で指定していないと、自分が想定したパターンと異なることが考えられますね・・。とても勉強になりました。ありがとうございます!
sousuke

2018/01/15 02:16

私もSQLServer使ってますので頑張りましょう。b ついでですがカーソルはデフォルトではグローバルなので DECLARE CUR_AAA CURSOR LOCAL FOR にしてカーソルをローカルにするといいと思います(外からカーソルを見ない場合はですが)。 また私はやったことありませんがnextしかしない場合 DECLARE CUR_AAA CURSOR LOCAL FAST_FORWARD FOR とするとパフォーマンスが上がるそうです。調べてみるといいと思います。
dera

2018/01/15 04:04

そういったものもあるんですね。 パフォーマンスまでは全然考慮していませんでした。 色々と教えていただき、ありがとうございます。 まだまだ触り始めたばかりなので、いろいろ試して頑張ってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問