次のような単純なテーブル変数があるとします。
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
最初の行だけに触れる必要があります(ヨゼフの答え下に)。