SQL Serverで Transact-SQL を使用して結果セットを反復処理する
この記事では、SQL Serverで Transact-SQL を使用して結果セットを反復処理するために使用できるさまざまなメソッドについて説明します。
元の製品バージョン: SQL Server
元の KB 番号: 111401
概要
この記事では、ストアド プロシージャ、トリガー、または Transact-SQL バッチでカーソルのような FETCH
-NEXT
ロジックをシミュレートするために使用できるさまざまなメソッドについて説明します。
Transact-SQL ステートメントを使用して結果セットを反復処理する
Transact-SQL ステートメントを使用して結果セットを反復処理するために使用できるメソッドは 3 つあります。
1 つの方法は、一時テーブルの使用です。 このメソッドでは、最初SELECT
のステートメントのスナップショットを作成し、カーソルの基礎として使用します。 例:
/********** example 1 **********/
DECLARE @au_id char( 11 )
SET rowcount 0
SELECT * INTO #mytemp FROM authors
SET rowcount 1
SELECT @au_id = au_id FROM #mytemp
WHILE @@rowcount <> 0
BEGIN
SET rowcount 0
SELECT * FROM #mytemp WHERE au_id = @au_id
DELETE #mytemp WHERE au_id = @au_id
SET rowcount 1
SELECT @au_id = au_id FROM #mytemp
END
SET rowcount 0
2 つ目の方法は、 関数を min
使用して一度に 1 行ずつテーブルをウォークすることです。 このメソッドは、ストアド プロシージャが実行を開始した後に追加された新しい行をキャッチします。新しい行に、クエリで処理されている現在の行より大きい一意の識別子がある場合。 例:
/********** example 2 **********/
DECLARE @au_id char( 11 )
SELECT @au_id = min( au_id ) FROM authors
WHILE @au_id IS NOT NULL
BEGIN
SELECT * FROM authors WHERE au_id = @au_id
SELECT @au_id = min( au_id ) FROM authors WHERE au_id > @au_id
END
注:
例 1 と 2 はどちらも、ソース テーブル内の各行に一意の識別子が存在することを前提としています。 場合によっては、一意の識別子が存在しない可能性があります。 その場合は、新しく作成されたキー列を使用するように一時テーブル メソッドを変更できます。 例:
/********** example 3 **********/
SET rowcount 0
SELECT NULL mykey, * INTO #mytemp FROM authors
SET rowcount 1
UPDATE #mytemp SET mykey = 1
WHILE @@rowcount > 0
BEGIN
SET rowcount 0
SELECT * FROM #mytemp WHERE mykey = 1
DELETE #mytemp WHERE mykey = 1
SET rowcount 1
UPDATE #mytemp SET mykey = 1
END
SET rowcount 0
関連情報
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示