web-dev-qa-db-ja.com

カーソルに指示してもテキストが印刷されない

次のスクリプトでは、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秒間待機してから、すべてのレコードを一緒に表示します。

これはカーソルのせいですか?このスクリプトを変更して意図したとおりに機能させるにはどうすればよいですか?

1
user8365

遅延の前に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
6
Martin Smith

残念ながら、カーソル内でWAITFORを使用することはできません。最善の解決策は、カーソルなしでクエリを書き直すことです...?