2011-12-25 13 views
2

ストアドプロシージャが実行されている間(複数のsetps)、ユーザーの進捗状況のフィードバックを表示したいと考えています。すべてのsqlコードはトランザクションに含まれているため、リアルタイムの更新を取得するためにサービスブローカーを使用しています。私のキューにメッセージがないので、以下のコードで何が間違っているのかを提案できますか?
より良い方法がありますか?Sqlの進捗状況がトランザクションにログインしています

--queue 
create queue myQueue 

--service 
create service myLogs 
on queue myQueue ([http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]); 

--log handler 
create event notification myLogHandler 
on server 
for userconfigurable_0 
to service 'myLogs', 'current database' ; 

--message 
EXEC master..sp_trace_generateevent @event_class = 82, @userinfo = N'test msg' 

---transaction test 
begin transaction 
EXEC master..sp_trace_generateevent @event_class = 82, @userinfo = N'tran test msg' 
rollback transaction 


--receive message 
declare @message_body xml; 
receive top (1) @message_body = message_body 
from myQueue 
select @message_body 

--display queue 
select * from myQueue 

答えて

1

私は何かを見る前に、ちょっと待ってからキューのビットから受信を再度実行する必要がありましたが、うまく動作します。

おそらく、データベース上にENABLE_BROKERが必要です。

ALTER DATABASE YourDB SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE 

-------------------------------- 
--Worker process 
-------------------------------- 

BEGIN TRANSACTION 

--While in your loop or at each stage of the proc you can do this 
INSERT INTO MyLoggingTable VALUES('My Message') 

COMMIT 

-------------------------------- 
--Reporting process 
-------------------------------- 

SELECT * FROM MyLoggingTable WITH (NOLOCK) 

NOLOCKは、あなたもPROCの進行状況を読むことができます:になり

+0

ありがとう、私は別のデータベースに移動していたと私はそれを逃した:) – witpo

+0

私のテストサーバー(SQL2008R2標準)に上記のコード(enable_broker)で移動しようとしています。私は新しいデータベースを作成する場合、すべてが大丈夫です。しかし、私はそれがすでに既存のdbで動作するようにすることはできません。私はsaアカウントを使用しているので、特権は問題ではありません。主な違いは、照合と互換性のレベルです(2005年と2008年)。互換性レベルを変更しました。違いはありません。助言がありますか? – witpo

+0

何も考えられない。おそらく 'ENABLE_BROKER'は間違いなく設定されていますか?プロファイラを使用しているときにユーザーが設定可能なイベントが発生するのを確認できますか?両方の場合は、可能性がありますすべてのオブジェクトを削除して再度作成しようとします。 –

3

アン間違いなく簡単な方法(警告は、DBへの既存の接続を強制終了されます)トランザクション内でそのログに記録します。

これにより、データ "LIVE"を読み取ることができますが、ワーカープロセスがロールバックを実行すると、データは削除されます。

@MyTableにロギングすると、これはロールバックに耐えられるため、ロールバックしてから@ MyTableのコンテンツをMyLoggingTableにコピーできます。

関連する問題