2012-05-31 19 views
11

Desidero cancellare la coda in SQL Server Management Studio, ma non desidero eliminare l'intera coda solo il contenuto della coda (i messaggi).come eliminare i messaggi nella coda del broker di servizi

Grazie, Senna

+10

Vuoi cancellare tutti i messaggi in tutte le code in un database ? Si dovrebbe usare 'ALTER DATABASE ... SET NEW_BROKER WITH ROLLBACK IMMEDIATE;' –

risposta

8

Qualcosa di simile dovrebbe funzionare:

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

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

Se si sta utilizzando un [modello di messaggistica in cui l'endpoint ricevente ripulisce la conversazione] (http://rusanu.com/2014/03/31/ how-to-prevent-conversation-endpoint-leaks /), potrebbe essere necessario dare un trattamento speciale a determinati messaggi ricevuti (ad esempio, chiama END CONVERSATION su tutti i messaggi il cui tipo è EndOfStream). –

9

userei end conversation (che sarà anche rimuovere tutti i messaggi correlati da tutte le code) con dichiarazione:

End Converstation @c With CleanUp 

se si riceve solo un messaggio, quindi si lascia aperta la conversazione. Fine conversazione con CleanUp è solo per situazioni specifiche.

36

Basta combinare le due risposte precedenti (di Ben e Jānis) per chiarezza. Questo ha funzionato per me:

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

Un altro aspetto positivo di questa risposta è che l'uso di 'SELECT' invece di' RECEIVE' rende possibile la pulizia della coda anche se è disabilitata. – jgauffin

+2

Ha funzionato per me quando ho cambiato il controllo (@@ ROWCOUNT = 0) con una condizione (@ c è nulla). Grazie – earthling42

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

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

Questa risposta, sebbene potenzialmente corretta, manca di contesto e sarebbe migliorata da un commento sul codice che spiega perché questa risposta funziona. Vedi http://stackoverflow.com/help/how-to-answer – Jonnus

1

Se si utilizza SQL Server (a partire con il 2008) si possono usare RICEZIONE

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