我想在 SQL Server Management Studio 中清除我的队列,但我不想只删除整个队列中的内容(消息)。
问问题
61894 次
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 回答