SQLServerでのカーソルの使い方と書き方!

この記事は約 5 分で読めます。

こんにちは!ヒロポンです!

SQLってWEB系のフレームワークを使っていたりすると、あまり意識することないと思いますが、、、

私は会社でSQLServerを使ってDBを管理しています。

なのでゴリゴリでSQL文書きます。

DBとアプリ側で処理を分ける際に、悩むこともあります。

ですがアプリ側で出来ればSQL処理は書きたくないところ。

そんなときに出会ったのが、SQLServerでのカーソルってやつなんですね!

SQLのカーソルの存在意義って?

私なりに理解をしたSQLでのカーソルの存在意義等を書いていきます。

そもそもカーソルとは、DBの行を1行ずつ変数に入れて、任意の処理をして、最後の行まで回すという処理です。

プログラムでいうところの、For eachににていますね!

このカーソルのおいしさ!存在意義なのですが、1行ずつInsertしたい時に使うのかなーーと思います。

具体的には、テーブルAからテーブルB,C,Dを作成する際などに使うと存在意義があるのかなーーと思います。

現在私が思うカーソルの存在意義はInsert文くらいです。。。それ以外にご存じの方は教えていただけますでしょうか。。。。

SQLServerでのカーソルの使い方と書き方

では早速本編!SQLServerでのカーソルの使い方と書き方に入っていきましょう!

カーソルの基本的な流れ

カーソルの基本的な流れは以下の通りです。

  1. カーソル宣言
  2. カーソルOpen
  3. カーソルの1行目を取り出し、上記変数に入れる
  4. 最終行まで処理をして、クローズ

カーソルの具体的な構文

以下のテーブルを例に、具体的な構文を見てみましょう。
テーブル名:customer

CustomerNameageaddress
鈴木20東京
斎藤30神奈川
田中25東京
佐藤26千葉

カーソルで使う変数の宣言

declare
    @CurName nvarchar(20),
    @CurAge  int,
    @address nvarchar(20)

カーソルの宣言

declare curデータ cursor local for
select CustomerName,age,address
from customer

カーソルのオープン

open curデータ

カーソルの値を変数に入れる

fetch next from curデータ
    into @CurName,@CurAge,@address

最終行までループ

while(@@fetch_status = 0)
BEGIN

-- ここに特定の処理を書く

-- 処理が終わったら変数の入れ替え
    fetch next from curデータ
        into @CurName,@CurAge,@address
END

カーソルを閉じる

close curデータ
deallocate curデータ

以上が基本的なカーソルの書き方となります。

ですが、実際はカーソルの途中でエラーになった時のことなどを考え、トランザクションも同時に考えたほうがいいのではないかと思います。

その場合の書き方は以下のようになります。

begin try
    begin transaction

        declare
            @CurName nvarchar(20),
            @CurAge  int,
            @address nvarchar(20)

        declare curデータ cursor local for
        select CustomerName,age,address
        from customer

        open curデータ

        fetch next from curデータ
            into @CurName,@CurAge,@address

        while(@@fetch_status = 0)
        BEGIN

        -- ここに特定の処理を書く

        -- 処理が終わったら変数の入れ替え
            fetch next from curデータ
                into @CurName,@CurAge,@address
        END

        close curデータ
        deallocate curデータ

    commit transaction

end try

begin catch

    rollback transaction

end catch

まとめ

SQLのカーソルはデータを1行ずつ取り出したいときに使うもので、例えばデータを1行ずつ条件かけてInsertする際に使ったりするといいのではないでしょうか。

とは言ってみたものの、大体はカーソル無しで実装できることが多いため、今後どのような場面でカーソルを使うのか分かればここに書いていきたいと思います!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA