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

Aplica-se a:SQL ServerAzure SQL Managed Instance

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

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

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

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

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

  4. CAST O corpo da mensagem de varbinary(max) para XML e atribua os resultados à 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 do erro.

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

Examples

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