Sql server Can';无法启用包含5条消息的队列

Sql server Can';无法启用包含5条消息的队列,sql-server,sql-server-2012,service-broker,Sql Server,Sql Server 2012,Service Broker,我正在使用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) 我有五排 我编写以

我正在使用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
我收到以下消息的错误:

错误:9617,服务队列“AsyncExecQueue”当前已禁用。

然后在SQL Management Studio上启用队列,但按F5刷新SQL Management Studio,然后禁用队列

有什么问题吗?我想清空队列。

这些是激活存储过程无法处理的消息,放回队列(在
CATCH
块中使用
ROLLBACK
),然后不断尝试重新处理。如果这种情况发生的次数足够多(5),队列将被禁用,以避免无休止的处理循环


您应该启用它并删除激活过程(
…STATUS=ON,activation(STATUS=OFF…
),这样它不会自动处理,然后您可以运行手动测试。

您是否已将队列设置为删除已接收的消息,如果未设置,队列中的消息是否具有状态3(保留已发送消息)?所有邮件的状态均为1。我不知道是否已在队列上设置为删除收到的邮件。这是我第一次在SQL Server上处理队列。在队列属性上,我发现“启用保留”为false。可能行已锁定,而您添加了
NOLOCK
(这非常不安全!)。或者出现了一个异常,您用空的catch吞并了它。这是生产代码吗?不要在生产代码中吞并。您确定在[TRZIC]数据库中运行RECEIVE吗?