1. ホーム
  2. sql-server

[解決済み] [Solved] TSQLでカーソルを使用せずにテーブル変数をループする方法はありますか?

2022-04-17 03:46:12

質問

例えば、次のような簡単なテーブル変数があるとします。

declare @databases table
(
    DatabaseID    int,
    Name        varchar(15),   
    Server      varchar(15)
)
-- insert a bunch rows into @databases

行を反復処理する場合、カーソルを宣言して使用するのが唯一の選択肢でしょうか?他の方法はないのでしょうか?

どのように解決するのですか?

まず第一に、各行を反復処理する必要があることを絶対に確認する必要があります。私が思いつく限り、あらゆるケースでセットベースの操作がより速く実行され、通常はよりシンプルなコードを使用します。

データによっては、ループは SELECT 文は、以下のようになります。

Declare @Id int

While (Select Count(*) From ATable Where Processed = 0) > 0
Begin
    Select Top 1 @Id = Id From ATable Where Processed = 0

    --Do some processing here

    Update ATable Set Processed = 1 Where Id = @Id 

End

もう一つの方法は、一時テーブルを使用することです。

Select *
Into   #Temp
From   ATable

Declare @Id int

While (Select Count(*) From #Temp) > 0
Begin

    Select Top 1 @Id = Id From #Temp

    --Do some processing here

    Delete #Temp Where Id = @Id

End

どのオプションを選ぶべきかは、データの構造と量に大きく依存します。

SQL Serverを使用している場合は、こちらを使用した方が良いでしょう。

WHILE EXISTS(SELECT * FROM #Temp)

使用方法 COUNT は、テーブルのすべての行に触れなければならないので EXISTS は最初の1つだけを触ればいいのです ( ヨーゼフさんの回答 となります。)