END CONVERSATION (Transact-SQL)

Si applica a: SQL Server Istanza gestita di SQL di Azure

Termina un lato di una conversazione esistente.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

END CONVERSATION conversation_handle  
   [   [ WITH ERROR = failure_code DESCRIPTION = 'failure_text' ]  
     | [ WITH CLEANUP ]  
    ]  
[ ; ]  

Argomenti

conversation_handle
Handle della conversazione da terminare.

WITH ERROR =failure_code
Codice di errore. Il failure_code è di tipo int. Il codice di errore è un codice definito dall'utente incluso nel messaggio di errore inviato all'altro lato della conversazione. Il codice di errore deve essere maggiore di 0.

DESCRIPTION =failure_text
Messaggio di errore. failure_text è di tipo nvarchar(3000). Il testo dell'errore è un messaggio testuale definito dall'utente incluso nel messaggio di errore inviato all'altro lato della conversazione.

WITH CLEANUP
Rimuove tutti i messaggi e le voci della vista del catalogo per un lato di una conversazione che non è possibile completare normalmente. La pulizia non viene notificata all'altro lato della conversazione. Microsoft SQL Server elimina l'endpoint della conversazione, tutti i messaggi per la conversazione nella coda di trasmissione e tutti i messaggi per la conversazione nella coda del servizio. Gli amministratori possono utilizzare questa opzione per rimuovere le conversazioni che non possono essere completate normalmente. Se, ad esempio, il servizio remoto viene rimosso in modo definitivo, un amministratore può utilizzare WITH CLEANUP per rimuovere le conversazioni associate a tale servizio. Non usare WITH CLEANUP nel codice di un'applicazione Service Broker. Se si esegue END CONVERSATION WITH CLEANUP prima che l'endpoint di ricezione confermi la ricezione di un messaggio, l'endpoint di invio invierà di nuovo il messaggio. In questo modo, il dialogo potrebbe essere eseguito di nuovo.

Osservazioni:

Quando si termina una conversazione, viene bloccato il gruppo di conversazioni a cui appartiene il valore conversation_handle specificato. Al termine di una conversazione, tramite Service Broker vengono rimossi dalla coda del servizio tutti i messaggi corrispondenti.

Dopo aver terminato una conversazione, le applicazioni non possono più inviare o ricevere messaggi per tale conversazione. Entrambi i partecipanti alla conversazione devono chiamare END CONVERSATION per completare la conversazione. Se Service Broker non riceve un messaggio di fine dialogo o un messaggio di errore dall'altro partecipante alla conversazione, tale partecipante riceve da Service Broker una notifica della fine della conversazione. In questo caso, sebbene l'handle della conversazione non sia più valido, l'endpoint della conversazione rimane attivo fino a quando l'istanza che ospita il servizio remoto non invia un acknowledgement per il messaggio di notifica.

Se Service Broker non ha già elaborato un messaggio di fine dialogo o un messaggio di errore per la conversazione, il lato remoto riceve da Service Broker una notifica della fine della conversazione. I messaggi inviati da Service Broker al servizio remoto dipendono dalle opzioni specificate:

  • Se la conversazione termina senza errori e la conversazione con il servizio remoto è ancora attiva, Service Broker invia un messaggio di tipo https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog al servizio remoto. Service Broker aggiunge questo messaggio alla coda di trasmissione nell'ordine della conversazione. Prima di inviare questo messaggio, Service Broker invia tutti i messaggi per questa conversazione che sono attualmente nella coda di trasmissione.

  • Se la conversazione termina con un errore e la conversazione con il servizio remoto è ancora attiva, Service Broker invia un messaggio di tipo https://schemas.microsoft.com/SQL/ServiceBroker/Error al servizio remoto. Service Broker elimina tutti gli altri messaggi per questa conversazione che sono attualmente nella coda di trasmissione.

  • La clausola WITH CLEANUP consente agli amministratori di database di rimuovere le conversazioni che non possono essere completate normalmente. Questa opzione rimuove tutti i messaggi e le voci della vista del catalogo per la conversazione. Si noti che, in questo caso, il lato remoto della conversazione non riceve notifica della fine della conversazione e potrebbe non ricevere i messaggi inviati da un'applicazione ma non ancora trasmessi in rete. È consigliabile utilizzare questa opzione solo se la conversazione non può essere completata normalmente.

Dopo la fine di una conversazione, l'esecuzione di un'istruzione SEND Transact-SQL che specifica l'handle della conversazione causa un errore Transact-SQL. Se vengono ricevuti messaggi per questa conversazione provenienti dall'altro lato della conversazione, tali messaggi vengono eliminati da Service Broker.

Se una conversazione termina mentre nel servizio remoto sono ancora presenti messaggi non inviati per la conversazione, il servizio remoto elimina i messaggi non inviati. Ciò non viene considerato un errore e pertanto il servizio remoto non riceve alcuna notifica dell'eliminazione dei messaggi.

I codici di errore specificati nella clausola WITH ERROR devono essere numeri positivi. I numeri negativi sono riservati ai messaggi di errore di Service Broker.

END CONVERSATION non è un'istruzione valida in una funzione definita dall'utente.

Autorizzazioni

Per terminare una conversazione attiva, l'utente corrente deve essere il proprietario della conversazione, un membro del ruolo predefinito del server sysadmin o un membro del ruolo predefinito del database db_owner.

I membri del ruolo predefinito del server sysadmin o del ruolo predefinito del database db_owner possono utilizzare WITH CLEANUP per rimuovere i metadati di una conversazione già completata.

Esempi

R. Fine di una conversazione

Nell'esempio seguente viene terminato il dialogo specificato da @dialog_handle.

END CONVERSATION @dialog_handle ;  

B. Fine di una conversazione con un errore

Nell'esempio seguente viene terminato il dialogo specificato da @dialog_handle con un errore, se l'istruzione di elaborazione restituisce un errore. Si noti che la gestione dell'errore illustrata nell'esempio è semplicistica e potrebbe non essere appropriata per alcune applicazioni.

DECLARE
    @dialog_handle UNIQUEIDENTIFIER,
    @ErrorSave INT,
    @ErrorDesc NVARCHAR(100);

BEGIN TRANSACTION;

-- Receive and process message

SET @ErrorSave = @@ERROR;

IF (@ErrorSave <> 0)
    BEGIN
        ROLLBACK TRANSACTION;
        SET @ErrorDesc = N'An error has occurred.';
        END CONVERSATION @dialog_handle
            WITH ERROR = @ErrorSave DESCRIPTION = @ErrorDesc;
    END;
ELSE
    COMMIT TRANSACTION;

C. Pulizia di una conversazione che non può essere completata normalmente

Nell'esempio seguente viene terminato il dialogo specificato da @dialog_handle. Tramite SQL Server vengono rimossi immediatamente tutti i messaggi dalla coda del servizio e dalla coda di trasmissione, senza inviare notifica al servizio remoto. Poiché la fine di un dialogo con pulizia non prevede notifiche al servizio remoto, è consigliabile usare questa operazione solo nei casi in cui il servizio remoto non è disponibile per la ricezione di un messaggio EndDialog or Error.

END CONVERSATION @dialog_handle WITH CLEANUP;  

Vedi anche

BEGIN CONVERSATION TIMER (Transact-SQL)
BEGIN DIALOG CONVERSATION (Transact-SQL)
sys.conversation_endpoints (Transact-SQL)