Como recuperar informações de uma mensagem de erro do Service Broker (Transact SQL)

Uma mensagem do tipo https://schemas.microsoft.com/SQL/ServiceBroker/Error é uma mensagem de erro do Service Broker. Mensagens deste tipo são documentos XML que contêm um código numérico para o erro e uma descrição do erro.

Para recuperar as informações de uma mensagem de erro do Service Broker

  1. Declare uma variável de tipo int para reter o código de erro.

  2. Declare uma variável de tipo nvarchar(3000) para reter a descrição de erro.

  3. Declare uma variável de tipo xml para manter uma representação XML do corpo da mensagem.

  4. Efetua CAST no corpo da mensagem do varbinary(max) para xml e atribui os resultados para a variável do tipo xml.

  5. Use a função value do tipo de dados xml para recuperar o código de erro.

  6. Use a função value do tipo de dados xml para recuperar a descrição de erro.

  7. Trate o erro conforme apropriado para seu aplicativo. Erros com códigos de erro negativos são gerados por meio do Service Broker. Erros com códigos de erro positivos são gerados por programas de serviço que executaram END CONVERSATION WITH ERROR.

Exemplo

-- 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

Consulte também

Conceitos

Outros recursos