Compartir vía


END CONVERSATION (Transact-SQL)

Se aplica a: SQL Server Azure SQL Managed Instance

Finaliza un extremo de una conversación existente.

Convenciones de sintaxis de Transact-SQL

Sintaxis

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

Argumentos

conversation_handle
Es el identificador de conversación que va a finalizar.

WITH ERROR =failure_code
Es el código de error. El failure_code es de tipo int. El código de error es un código definido por el usuario que se incluye en el mensaje de error enviado al otro extremo de la conversación. El código de error debe ser mayor que 0.

DESCRIPTION =failure_text
Es el mensaje de error. El failure_text es de tipo nvarchar (3000). El texto del error es texto definido por el usuario que se incluye en el mensaje de error enviado al otro extremo de la conversación.

WITH CLEANUP
Quita todos los mensajes y todas las entradas de la vista de catálogo para un lado de una conversación que no se puede completar con normalidad. No se le informa de la limpieza al otro lado de la conversación. Microsoft SQL Server quita el extremo de conversación, todos los mensajes de la conversación que estén en la cola de transmisión y todos los mensajes de la conversación que estén en la cola de servicio. Los administradores pueden utilizar esta opción para quitar las conversaciones que no se completan con normalidad. Por ejemplo, si el servicio remoto se ha quitado de manera permanente, un administrador puede utilizar WITH CLEANUP para quitar las conversaciones con ese servicio. No use WITH CLEANUP en el código de una aplicación de Service Broker. Si se ejecuta END CONVERSATION WITH CLEANUP antes de que el extremo receptor confirme la recepción de un mensaje, el extremo de envío enviará el mensaje de nuevo. Esto podría volver a ejecutar el cuadro de diálogo.

Observaciones

Al finalizar una conversación, se bloquea el grupo de conversaciones al que pertenece el conversation_handle suministrado. Cuando finaliza una conversación, Service Broker quita todos los mensajes de la conversación de la cola de servicio.

Después de que una conversación finaliza, ninguna aplicación puede enviar o recibir mensajes para esa conversación. Los dos participantes de una conversación deben llamar a END CONVERSATION para que la conversación finalice. Si Service Broker no ha recibido ningún mensaje de fin de diálogo ni ningún mensaje de error del otro participante de la conversación, Service Broker notifica al otro participante que la conversación ha finalizado. En este caso, aunque el identificador de conversación ya no es válido, el extremo de la conversación sigue activo hasta que la instancia que hospeda el servicio remoto confirma el mensaje.

Si Service Broker no ha procesado ningún mensaje de fin de diálogo ni ningún mensaje de error para la conversación, Service Broker notifica al extremo remoto que la conversación ha finalizado. Los mensajes que Service Broker envía al servicio remoto dependen de las opciones especificadas:

  • Si la conversación finaliza sin errores y la conversación con el servicio remoto sigue activa, Service Broker envía un mensaje de tipo https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog al servicio remoto. Service Broker agrega este mensaje a la cola de transmisión de acuerdo con el orden de la conversación. Antes de enviar este mensaje, Service Broker envía todos los mensajes de esta conversación que se encuentren en la cola de transmisión.

  • Si la conversación finaliza con un error y la conversación con el servicio remoto sigue activa, Service Broker envía un mensaje de tipo https://schemas.microsoft.com/SQL/ServiceBroker/Error al servicio remoto. Service Broker quita los demás mensajes de esta conversación que se encuentren en la cola de transmisión.

  • La cláusula WITH CLEANUP permite al administrador de la base de datos quitar las conversaciones que no finalizan con normalidad. Esta opción quita todos los mensajes y todas las entradas de la vista de catálogo para la conversación. Observe que, en este caso, el extremo remoto de la conversación no recibe ninguna indicación de que la conversación ha finalizado y puede que no reciba los mensajes enviados por una aplicación que todavía no se hayan transmitido a través de la red. Evite esta opción a menos que la conversación no pueda finalizar con normalidad.

Una vez finalizada una conversación, una instrucción SEND de Transact-SQL que especifique el identificador de conversación provocará un error de Transact-SQL. Si los mensajes de esta conversación proceden del otro extremo de la conversación, Service Broker los descarta.

Si una conversación finaliza pero el servicio remoto todavía tiene mensajes sin enviar para la conversación, el servicio remoto quita los mensajes no enviados. Esto no se considera un error, por lo que el servicio remoto no recibirá ninguna notificación de que se han quitado los mensajes.

Los códigos de error especificados en la cláusula WITH ERROR deben ser números positivos. Los números negativos se reservan para los mensajes de error de Service Broker.

END CONVERSATION no es válido en una función definida por el usuario.

Permisos

Para finalizar una conversación activa, el usuario actual debe ser el propietario de la conversación, miembro del rol fijo de servidor sysadmin o miembro del rol fijo de base de datos db_owner.

Los miembros del rol fijo de servidor sysadmin o del rol fijo de base de datos db_owner pueden utilizar WITH CLEANUP para quitar los metadatos de una conversación que ya ha finalizado.

Ejemplos

A. Finalizar una conversación

El ejemplo siguiente finaliza el cuadro de diálogo que especifica @dialog_handle.

END CONVERSATION @dialog_handle ;  

B. Finalizar una conversación con un error

En el ejemplo siguiente se finaliza con un error el cuadro de diálogo especificado por @dialog_handle si la instrucción que se está procesando genera un error. Tenga en cuenta que éste es un planteamiento simplista del control de errores y puede no ser adecuado para algunas aplicaciones.

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. Limpiar una conversación que no puede finalizar con normalidad

El ejemplo siguiente finaliza el cuadro de diálogo que especifica @dialog_handle. SQL Server quita inmediatamente todos los mensajes de la cola de servicio y la cola de transmisión, sin notificárselo al servicio remoto. Dado que, cuando un cuadro de diálogo finaliza con la opción de limpieza, el servicio remoto no recibe ninguna notificación, esta opción se debe usar únicamente cuando el servicio remoto no esté disponible para recibir un mensaje EndDialog o Error.

END CONVERSATION @dialog_handle WITH CLEANUP;  

Consulte también

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