2012-05-31 39 views
11

我想在SQL Server Management Studio中清除我的队列,但我不想删除整个队列只是队列中的内容(消息)。如何删除服务代理队列中的消息

感谢, 塞纳

+10

是否要清除数据库中的所有队列的所有消息?你应该使用'ALTER DATABASE ... SET NEW_BROKER WITH ROLLBACK IMMEDIATE;' –

回答

8

像这样的东西应该工作:

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

     if (@@rowcount = 0) 
     begin 
      break; 
     end 
    ), timeout 1000; 
end 
+0

如果你正在使用[接收端点清理对话的消息模式](http://rusanu.com/2014/03/31/如何防止对话 - 端点泄漏/),您可能需要对某些收到的消息进行特殊处理(例如,对任何类型为EndOfStream的消息调用END CONVERSATION)。 –

9

我会用end conversation(也将从所有队列中删除所有相关的消息)using语句:

End Converstation @c With CleanUp 

如果你只是收到消息,然后你打开对话。 使用CleanUp结束对话仅适用于特定情况。

36

只是为了清晰起见,将前两个答案(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 
+1

这个答案的另一个好处是,使用'SELECT'而不是'RECEIVE'可以清除队列,即使它被禁用。 – jgauffin

+2

当我用(@c为null)条件更改(@@ ROWCOUNT = 0)检查时为我工作。谢谢 – earthling42

-2
while(1=1) 
begin 
    waitfor (
     receive top(1) 
     conversation_group_id 
     from kartokumaqueue2), timeout 1000; 

     if(@@ROWCOUNT = 0) break; 
end 
+1

这个答案虽然潜在的正确性缺乏上下文,并会通过代码评论来改进,说明为什么这个答案有效。请参阅http://stackoverflow.com/help/how-to-answer – Jonnus

1

如果使用SQL Server(从2008年),可以使用RECEIVE

WHILE (0=0) 
BEGIN 
RECEIVE * FROM Dbo.YourQueue 
END 
相关问题