2012-05-31 4 views
11

Ich möchte meine Warteschlange in SQL Server Management Studio löschen, aber ich möchte nicht die gesamte Warteschlange nur den Inhalt in der Warteschlange (die Nachrichten) löschen.wie Nachrichten in Service Broker-Warteschlange gelöscht werden

Danke, Senna

+10

Haben Sie alle Nachrichten in allen Warteschlangen in einer Datenbank löschen möchten ? Sie sollten 'ALTER DATABASE ... SET NEW_BROKER MIT ROLLBACK IMMEDIATE verwenden;' –

Antwort

8

So etwas wie dies funktionieren soll:

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

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

Wenn Sie ein [Messaging-Muster verwenden, bei dem der empfangende Endpunkt die Konversation aufräumt] (http://rusanu.com/2014/03/31/ Wie verhindert man Konversations-Endpunkt-Lecks /), müssen Sie möglicherweise bestimmte empfangene Nachrichten speziell behandeln (z. B. END CONVERSATION für alle Nachrichten aufrufen, deren Typ EndOfStream ist). –

9

würde ich end conversation verwenden (das auch alle zugehörigen Nachrichten aus allen Warteschlangen entfernen) Anweisung:

End Converstation @c With CleanUp 

Wenn Sie nur eine Nachricht erhalten, lassen Sie die Konversation offen. Ende Konversation Mit CleanUp ist nur für bestimmte Situationen.

36

Kombinieren Sie einfach die beiden vorherigen Antworten (von Ben und Jānis) für Klarheit. Dieser arbeitete für mich:

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

Eine weitere gute Sache mit dieser Antwort ist, dass die Verwendung von 'SELECT' anstelle von' RECEIVE' es ermöglicht, die Warteschlange auch dann zu bereinigen, wenn sie deaktiviert ist. – jgauffin

+2

Arbeitete für mich, als ich die (@@ ROWCOUNT = 0) Prüfung mit einer Bedingung (@c ist Null) änderte. Danke – earthling42

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

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

Diese Antwort, obwohl potentiell richtig, fehlt Kontext und würde durch einen Code-Kommentar verbessert werden, der erklärt, warum diese Antwort funktioniert. Siehe http://stackoverflow.com/help/how-to-answer – Jonnus

1

Wenn Sie SQL Server verwenden (mit ab 2008) erhalten Sie können

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