22

我想在 SQL Server Management Studio 中清除我的队列,但我不想只删除整个队列中的内容(消息)。

4

6 回答 6

51

为了清楚起见,只需结合前面的两个答案(Ben 和 Jānis)。这对我有用:

declare @c uniqueidentifier
while(1=1)
begin
    select top 1 @c = conversation_handle from dbo.queuename
    if (@@ROWCOUNT = 0)
    break
    end conversation @c with cleanup
end
于 2013-10-10T19:50:32.253 回答
23

像这样的东西应该工作:

while(1=1)
begin
    waitfor (
        receive top(1)
        conversation_group_id
        from dbo.yourQueue
    ), timeout 1000;

    if (@@rowcount = 0)
        break;
end
于 2012-05-31T14:35:21.240 回答
8

我将使用以下语句使用结束对话 (这也将从所有队列中删除所有相关消息):

End Converstation @c With CleanUp

如果您只是收到消息,那么您将对话保持打开状态。使用 CleanUp 结束对话仅适用于特定情况。

于 2012-06-04T14:30:52.090 回答
2

如果您使用的是 SQL Server(从 2008 年开始),您可以使用 RECEIVE

WHILE (0=0)
BEGIN
    RECEIVE * FROM dbo.YourQueue;
    IF (@@ROWCOUNT = 0) BREAK;
END
于 2017-10-31T17:08:57.920 回答
0

我遇到了与原始海报相同的问题,但我需要清除包含数百万条消息的队列(失败的消息队列,尤其是在多年未检查的非生产环境中)。

上面的解决方案本来可以工作,但每分钟处理不到 10 条消息。通过分批进行,我每分钟收到 30000 条消息。

代码中唯一值得注意的项目是where validation = 'N'. 这将对话句柄限制为真实消息。响应/错误有一个重复的对话句柄,该句柄被end conversation. 如果没有这个子句,脚本仍然可以工作,但会在输出中产生很多错误。

declare @conversationBatch table (convH uniqueidentifier)
declare @conversationHandle uniqueidentifier

declare convCursor cursor for
    select convH from @conversationBatch

insert into @conversationBatch
    select top 1000 conversation_handle  
      from dbo.queuename WITH (NOLOCK) 
     where validation = 'N'


while @@rowcount > 0
begin
    open convCursor
    fetch next from convCursor into @conversationHandle
    while @@FETCH_STATUS = 0 
    begin
        end conversation @conversationHandle with cleanup
        fetch next from convCursor into @conversationHandle
    end
    close convCursor

    delete from @conversationBatch
    insert into @conversationBatch
        select top 1000 conversation_handle  
          from dbo.queuename WITH (NOLOCK) 
         where validation = 'N'
    
 end

 deallocate convCursor
于 2021-11-08T21:22:27.493 回答
-2
while(1=1)
begin
    waitfor (
        receive top(1)
        conversation_group_id
        from kartokumaqueue2), timeout 1000;

        if(@@ROWCOUNT = 0) break;
end
于 2015-12-10T12:14:15.573 回答