カーソルを使用せずに TSQL でテーブル変数をループする方法はありますか? 質問する

カーソルを使用せずに TSQL でテーブル変数をループする方法はありますか? 質問する

次のような単純なテーブル変数があるとします。

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

行を反復処理したい場合、カーソルを宣言して使用するしか方法はありませんか? 別の方法はありますか?

ベストアンサー1

まず、各行を反復処理する必要があることを必ず確認する必要があります。セット ベースの操作は、考えられるすべてのケースでより高速に実行され、通常はより簡単なコードが使用されます。

データによっては、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最初の行だけに触れる必要があります(ヨゼフの答え下に)。

おすすめ記事