Condividi tramite


Procedura: Recuperare informazioni da un messaggio di errore di Service Broker (Transact SQL)

Si applica a:SQL ServerIstanza gestita di SQL di Azure

Un messaggio di tipo https://schemas.microsoft.com/SQL/ServiceBroker/Error è un messaggio di errore di Service Broker. I messaggi di questo tipo sono documenti XML che contengono un codice numerico di errore e una descrizione dell'errore.

Recuperare le informazioni da un messaggio di errore di Service Broker

  1. Dichiarare una variabile di tipo int per contenere il codice di errore.

  2. Dichiarare una variabile di tipo nvarchar(3000) per contenere la descrizione dell'errore.

  3. Dichiarare una variabile di tipo xml per contenere una rappresentazione XML del corpo del messaggio.

  4. CAST corpo del messaggio da varbinary(max) a xml e assegnare i risultati alla variabile di tipo xml.

  5. Utilizzare la funzione value del tipo di dati xml per recuperare il codice di errore.

  6. Utilizzare la funzione value del tipo di dati xml per recuperare la descrizione dell'errore.

  7. Gestire l'errore in base alle esigenze dell'applicazione. Gli errori con codici di errore negativi vengono generati da Service Broker, Gli errori con codici di errore positivi vengono generati dai programmi del servizio che hanno eseguito END CONVERSATION WITH ERROR.

Esempi

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