我正在使用SQL Server Express 2012并且我有一个队列。
当我运行时:
SELECT TOP 1000 *, casted_message_body =
CASE message_type_name WHEN 'X'
THEN CAST(message_body AS NVARCHAR(MAX))
ELSE message_body
END
FROM [TRZIC].[dbo].[AsyncExecQueue] WITH(NOLOCK)
我得到五行。
我只做了以下脚本来清空队列。但是,当我运行它时:
declare @h uniqueidentifier
, @messageTypeName sysname
, @messageBody varbinary(max)
begin try
receive top(1)
@h = [conversation_handle]
, @messageTypeName = [message_type_name]
, @messageBody = [message_body]
from [AsyncExecQueue];
end try
begin catch
declare @error int
, @message nvarchar(2048)
, @xactState smallint;
select @error = ERROR_NUMBER()
, @message = ERROR_MESSAGE()
, @xactState = XACT_STATE();
raiserror(N'Error: %i, %s', 16, 1, @error, @message);
end catch
我收到以下消息的错误:
Error: 9617, The service queue "AsyncExecQueue" is currently disabled.
然后我在SQL Management Studio上启用队列,但是按F5刷新SQL Management Studio,然后禁用队列。
有什么问题吗?我想清空队列。
答案 0 :(得分:3)
If the queue is disabling itself, it's almost always an issue with poison messages.这些是激活sproc无法处理的消息,放回队列(ROLLBACK
块中有CATCH
),然后不断尝试重新处理。如果这种情况发生的次数足够多(5),则会禁用队列以避免无休止的处理循环。
您应该ALTER
your queue启用它并删除激活程序(...STATUS = ON, ACTIVATION (STATUS = OFF...
),这样它就不会自动处理,然后您可以运行手动测试。