Sql server 事务中的Sql进度日志记录

Sql server 事务中的Sql进度日志记录,sql-server,tsql,transactions,Sql Server,Tsql,Transactions,我希望在存储过程运行时为用户显示进度反馈(多个SETP)。所有sql代码都在事务中,所以我使用ServiceBroker获取实时更新。由于我的队列中没有收到任何消息,您能建议下面的代码有什么问题吗? 有更好的方法吗 --queue create queue myQueue --service create service myLogs on queue myQueue ([http://schemas.microsoft.com/SQL/Notifications/PostEventNotif

我希望在存储过程运行时为用户显示进度反馈(多个SETP)。所有sql代码都在事务中,所以我使用ServiceBroker获取实时更新。由于我的队列中没有收到任何消息,您能建议下面的代码有什么问题吗?
有更好的方法吗

--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

这对我来说很好,不过我需要等待几分钟,然后再次运行接收队列位,然后才能看到任何内容

也许您需要
在数据库上启用\u 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的进度,即使它在事务内部登录到它

请注意,这允许您“实时”读取数据,但如果工作进程进行回滚,则数据将被删除


您可以通过登录到@MyTable来解决这个问题,这将在回滚后生存,因此您可以回滚并将@MyTable的内容复制到MyLoggingTable中。

谢谢,我正在从一个数据库移动到另一个数据库,但我错过了:)我正在尝试将上述代码(使用enable_broker)移动到我的测试服务器(SQL2008R2标准). 如果我创建一个新数据库,一切都正常。但是我不能让它在已经存在的数据库上工作。我正在使用sa帐户,所以特权不应该是问题。主要区别在于排序规则和兼容性级别(2005年与2008年)。我更改了兼容性级别–没有差异。有什么建议吗?想不出什么。想必,
ENABLE\u BROKER
已明确设置?在使用探查器时,是否可以看到正在触发的用户可配置事件?如果这两个选项都是“是”,则可以尝试删除所有对象并重新创建。查看sys.databases is\u broker\u enabled为1。我可以在分析器中看到它。我尝试过几次删除并重新创建所有对象。数据库是从SQL 2005传输的,这会影响它吗?从我到目前为止所阅读的内容来看,ServiceBroker在2005年到2008年间应该可以正常工作。也许可以使用探查器来跟踪各种
代理:
事件。看看有没有什么线索。