END CONVERSATION (Transact-SQL)

Data aggiornamento: 15 settembre 2007

Termina un lato di una conversazione esistente.

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. 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
    Consente di rimuovere tutti i messaggi e le voci della vista del catalogo per un lato di una conversazione che non può completarsi normalmente. L'altro lato della conversazione non riceve alcuna notifica dell'operazione di eliminazione. 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. Ad esempio, se il servizio remoto viene rimosso in modo definitivo, l'amministratore può utilizzare WITH CLEANUP per rimuovere le conversazioni associate a tale servizio. Non utilizzare WITH CLEANUP nel codice di un'applicazione Service Broker. Se END CONVERSATION WITH CLEANUP viene eseguito prima che l'endpoint ricevente riconosca la ricezione di un messaggio, l'endpoint mittente invierà di nuovo il messaggio. Questo potrebbe potenzialmente rieseguire la finestra di dialogo.

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 vengono rimossi tutti i messaggi corrispondenti dalla coda del servizio.

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 ha ricevuto un messaggio di termina dialogo o un messaggio di errore dall'altro partecipante alla conversazione, tale partecipante riceve 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 acknowledgment per il messaggio di notifica.

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

  • Se la conversazione termina senza opzioni e la conversazione al 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 in ordine di conversazione. Service Broker invia tutti i messaggi per questa conversazione che sono attualmente nella coda di trasmissione prima di inviare questo messaggio.
  • Se la conversazione termina senza un errore e la conversazione al servizio remoto è ancora attiva, Service Broker invia un messaggio di tipo https://schemas.microsoft.com/SQL/ServiceBroker/Error al servizio remoto. Service Broker elimina 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'istruzione Transact-SQL SEND che specifica l'handle della conversazione causerà un errore Transact-SQL. Se arrivano messaggi per questa conversazione dall'altro lato della conversazione, tali messaggi verranno 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. Per ulteriori informazioni sui messaggi di errore Service Broker, vedere Messaggi 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

A. Fine di una conversazione

In questo esempio viene terminata la finestra di dialogo specificata da @dialog_handle.

END CONVERSATION @dialog_handle ;

B. Fine di una conversazione con un errore

In questo esempio viene terminato il dialogo specificato @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. Pulitura di una conversazione che non può essere completata normalmente

In questo esempio è terminata la finestra di dialogo specificata da @ dialog_handle. SQL Server immediatamente rimuove tutti i messaggi dalla coda del servizio e la coda di trasmissione, senza notificare il servizio remoto. Poiché la fine di un dialogo con pulitura non prevede notifiche al servizio remoto, è consigliabile utilizzare questa operazione solo nei casi in cui il servizio remoto non è disponibile per la ricezione di un messaggio EndDialog o Error.

END CONVERSATION @dialog_handle WITH CLEANUP ;

Vedere anche

Riferimento

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

Altre risorse

Messaggi di Service Broker
Conversazioni di dialogo
Esercitazioni su Service Broker

Guida in linea e informazioni

Assistenza su SQL Server 2005

Cronologia modifiche

Release Cronologia

15 settembre 2007

Contenuto modificato:
  • Chiarimento sull'utilizzo di WITHOUT CLEANUP.