Cómo recuperar información de un mensaje de error de Service Broker (Transact-SQL)

Un mensaje de tipo https://schemas.microsoft.com/SQL/ServiceBroker/Error es un mensaje de error de Service Broker. Los mensajes de este tipo son documentos XML que contienen un código numérico para el error y una descripción del error.

Para recuperar la información de un mensaje de error de Service Broker

  1. Declare una variable de tipo int para contener el código de error.

  2. Declare una variable de tipo nvarchar(3000) para contener la descripción del error.

  3. Declare una variable de tipo xml para contener una representación XML del cuerpo del mensaje.

  4. Convierta con CAST el cuerpo del mensaje de varbinary(max) a xml y asigne los resultados a la variable de tipo xml.

  5. Utilice la función value del tipo de datos xml para recuperar el código de error.

  6. Utilice la función value del tipo de datos xml para recuperar la descripción del error.

  7. Controle el error como sea conveniente para su aplicación. Service Brokergenera los errores con códigos de error negativos. Los programas de servicio que ejecutan END CONVERSATION WITH ERROR generan errores con códigos de error positivos.

Ejemplo

-- The variables to hold the error code and the description are
-- provided by the caller.

CREATE PROCEDURE [ExtractBrokerError]
  ( @message_body VARBINARY(MAX),
    @code int OUTPUT,
    @description NVARCHAR(3000) OUTPUT )
AS
BEGIN

-- Declare a variable to hold an XML version of the message body.

DECLARE @xmlMessage XML;

-- CAST the provided message body to XML.

SET @xmlMessage = CAST(@message_body AS XML);
SET @code = @@ERROR

IF @@ERROR<>0
  RETURN @code

-- Retrieve the error code from the Code element.

SET @code = (
      SELECT @xmlMessage.value(
        N'declare namespace
           brokerns="https://schemas.microsoft.com/SQL/ServiceBroker/Error";
               (/brokerns:Error/brokerns:Code)[1]', 
        'int')
        );

-- Retrieve the description of the error from the Description element.

SET @description = (
      SELECT @xmlMessage.value(
        'declare namespace
           brokerns="https://schemas.microsoft.com/SQL/ServiceBroker/Error";
           (/brokerns:Error/brokerns:Description)[1]', 
        'nvarchar(3000)')
        );


RETURN 0;

END
GO

Vea también

Conceptos

Otros recursos