2012-05-31 26 views
11

Tôi muốn xóa hàng đợi trong SQL Server Management Studio, nhưng tôi không muốn xóa toàn bộ hàng đợi chỉ nội dung trong hàng đợi (thư).cách xóa thư trong hàng đợi của nhà môi giới dịch vụ

Cảm ơn, Senna

+10

Bạn có muốn xóa tất cả các thông điệp trong tất cả các hàng đợi trong một cơ sở dữ liệu ? Bạn nên sử dụng 'ALTER DATABASE ... SET NEW_BROKER VỚI ROLLBACK IMMEDIATE;' –

Trả lời

8

Something như thế này nên làm việc:

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

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

Nếu bạn đang sử dụng [mẫu nhắn tin nơi điểm cuối nhận được dọn dẹp cuộc hội thoại] (http://rusanu.com/2014/03/31/ làm thế nào để ngăn chặn-cuộc trò chuyện-điểm cuối-rò rỉ /), bạn có thể cần phải cung cấp cho điều trị đặc biệt cho một số tin nhắn nhận được (ví dụ như gọi END CONVERSATION trên bất kỳ tin nhắn có loại EndOfStream). –

9

Tôi sẽ sử dụng end conversation (đó cũng sẽ loại bỏ tất cả các thư có liên quan từ tất cả hàng) sử dụng tuyên bố:

End Converstation @c With CleanUp 

nếu bạn chỉ nhận được tin nhắn, sau đó bạn rời khỏi cuộc trò chuyện mở. Kết thúc cuộc trò chuyện với CleanUp chỉ dành cho các tình huống cụ thể.

36

Chỉ cần kết hợp hai câu trả lời trước đó (bởi Ben và Jānis) để làm rõ. Điều này làm việc cho tôi:

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

Một điều tốt nữa với câu trả lời này là sử dụng 'SELECT' thay vì' RECEIVE' làm cho nó có thể dọn dẹp hàng đợi ngay cả khi nó bị vô hiệu hóa. – jgauffin

+2

Làm việc cho tôi khi tôi thay đổi (@@ ROWCOUNT = 0) kiểm tra với một điều kiện (@c là null). Cảm ơn – earthling42

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

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

Câu trả lời này trong khi có khả năng sửa thiếu ngữ cảnh và sẽ được cải thiện bằng một bình luận mã nêu rõ lý do tại sao câu trả lời này hoạt động. Xem http://stackoverflow.com/help/how-to-answer – Jonnus

1

Nếu bạn đang sử dụng SQL Server (bắt đầu với năm 2008), bạn có thể sử dụng NHẬN

WHILE (0=0) 
BEGIN 
RECEIVE * FROM Dbo.YourQueue 
END