次のスクリプトでは、WAITFOR
をカーソルと組み合わせて使用しました。
create table orders(orderId int primary key,productId int,productName varchar(20));
insert into orders values(1,11,'book');
insert into orders values(2,13,'flower');
insert into orders values(3,24,'microwave');
insert into orders values(4,7,'food');
insert into orders values(5,46,'clothes');
declare cur cursor for
select * from orders;
open cur;
fetch next from cur;
while(@@fetch_status=0)
begin
waitfor delay '00:00:01';
fetch next from cur;
end;
close cur;
deallocate cur;
指定した1秒間隔でカーソルから1レコードを表示したいと思っています。例:最初の行を表示してから、1秒待ちます。 2番目の行を表示してから、1秒待ちます。等々。上のカーソルはそれを行いません。 orders
に5行あるとします。 WHILE
ブロックは5秒間待機してから、すべてのレコードを一緒に表示します。
これはカーソルのせいですか?このスクリプトを変更して意図したとおりに機能させるにはどうすればよいですか?
遅延の前にRAISERROR('', 0, 1) WITH NOWAIT
を追加して、バッファ内のすべてのものを最初にクライアント(SSMS?)にフラッシュします。そうしないと、SQLServerはパケットがいっぱいになるまでさらにデータを待機します。
Declare cur cursor for
select * from orders
open cur
fetch next from cur
while(@@fetch_status=0)
begin
RAISERROR('', 0, 1) WITH NOWAIT
WAITFOR DELAY '00:00:01'
fetch next from cur
end
close cur
deallocate cur
残念ながら、カーソル内でWAITFORを使用することはできません。最善の解決策は、カーソルなしでクエリを書き直すことです...?