END CONVERSATION (Transact-SQL)

Actualizado: 15 de septiembre de 2007

Finaliza un extremo de una conversación existente.

Sintaxis

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

Argumentos

  • conversation_handle
    Es el asa de la conversación que va a finalizar.
  • WITH ERROR = failure_code
    Es el código de error. 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. 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 entradas de la vista de catálogo de un extremo de una conversación que no puede completarse normalmente. No se notifica al otro extremo de la conversación del proceso de limpieza. Microsoft SQL Server elimina el extremo de la 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 usar 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 de ese servicio. No utilice 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 emisor volverá a enviar el mensaje. Esto podría volver a ejecutar el diálogo.

Notas

Al finalizar una conversación se bloquea el grupo de conversaciones al que pertenece el conversation_handle suministrado. Cuando una conversación finaliza, 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, notifica al otro participante que la conversación ha finalizado. En este caso, aunque el asa de la conversación ya no es válido, el extremo de la conversación sigue activo hasta que la instancia que aloja 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 en 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 opciones y la conversación con el servicio remoto sigue activa, Service Broker envía un mensaje del tipo https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog al servicio remoto. Service Broker agrega este mensaje a la cola de transmisión por orden de 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 del tipo https://schemas.microsoft.com/SQL/ServiceBroker/Error al servicio remoto. Service Broker elimina 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.

Después de que una conversación finaliza, una instrucción SEND de Transact-SQL que especifique el identificador de la 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. Para obtener más información sobre los mensajes de error de Service Broker, vea Mensajes 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 de la función fija de servidor sysadmin o miembro de la función fija de base de datos db_owner.

Los miembros de la función fija de servidor sysadmin o de la función fija de base de datos db_owner pueden utilizar WITH CLEANUP para quitar los metadatos de una conversación que ya se ha completado.

Ejemplos

A. Finalizar una conversación

En este ejemplo se finaliza el diálogo especificado por @dialog_handle.

END CONVERSATION @dialog_handle ;

B. Finalizar una conversación con un error

En este ejemplo se finaliza el diálogo especificado por @dialog_handle con un error 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

En este ejemplo se finaliza el diálogo especificado por @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 diálogo finaliza con la opción de limpieza el servicio remoto no recibe ninguna notificación, debe utilizarse únicamente cuando el servicio remoto no está disponible para recibir un mensaje EndDialog o Error.

END CONVERSATION @dialog_handle WITH CLEANUP ;

Vea también

Referencia

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

Otros recursos

Mensajes de Service Broker
Conversaciones de diálogo
Tutoriales de Service Broker

Ayuda e información

Obtener ayuda sobre SQL Server 2005

Historial de cambios

Lanzamiento Historial

15 de septiembre de 2007

Contenido modificado:
  • Se aclaró el uso de WITHOUT CLEANUP.