セージ の メモ書き

メモこそ命の恩人だ

SQL - カーソル

カーソル(Cursor)

https://docs.microsoft.com/ja-jp/sql/t-sql/language-elements/cursors-transact-sql

https://docs.microsoft.com/ja-jp/sql/relational-databases/cursors

  • SELECTの結果について、データを1行ずつ処理する仕組み。
  • カーソルにより、どのレコードを処理するか指定できる。
  • レコードを一つずつチェックし、INSERT/UPDATE/DELETEを行う。
  • メリット
    • アプリでやるような処理をSQLでも記述できる。

実験用テーブル

USE SampleDB

/* テーブル削除 */
IF ObJECt_ID('[SampleTable]') IS NOT NULL DROP TABLE [SampleTable];

/* テーブル追加 */
CREATE TABLE [SampleTable]
(
    [Id] int NOT NULL,
    [Name] nvarchar(50),
    [Age] int NOT NULL,
    PRIMARY KEY ([Id])
);

GO

/* レコード追加 */
INSERT INTO [dbo].[SampleTable]([Id],[Name],[Age]) VALUES (1, '顧客001', 30);
INSERT INTO [dbo].[SampleTable]([Id],[Name],[Age]) VALUES (2, '顧客002', 35);
INSERT INTO [dbo].[SampleTable]([Id],[Name],[Age]) VALUES (3, '顧客003', 40);

GO

使用手順

-- CURSOR型の変数を定義し、カーソル処理をセット
DECLARE @cur CURSOR
SET @cur = CURSOR FOR SELECT Id, Name FROM SampleTable

-- カーソルのオープン
OPEN @cur


--カーソルの値を取得する変数を定義
DECLARE @W_Id int
DECLARE @W_Name nvarchar(50)


-- 最初の1行目を取得し、変数に値をセット
FETCH NEXT FROM @cur INTO @W_Id,@W_Name


--データの行数分ループ処理を実行する
WHILE @@FETCH_STATUS = 0
BEGIN

    -- =================================
    -- ↓任意の処理を記述
    -- =================================

    -- SELECT実施(CRUD操作を行える。)
    SELECT * FROM SampleTable WHERE Id = @W_Id
    SELECT * FROM SampleTable WHERE Name = @W_Name

    -- =================================
    -- ↑任意の処理を記述
    -- =================================


    -- 次の行のデータを取得
    FETCH NEXT FROM @cur INTO @W_Id,@W_Name

END


-- カーソルのクローズ
CLOSE @cur



以上