Condividi tramite


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

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 contenenti un codice numerico e una descrizione dell'errore.

Per recuperare le informazioni da un messaggio di errore di Service Broker

  1. Dichiarare una variabile di tipo int per la memorizzazione del codice di errore.

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

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

  4. Utilizzare la funzione CAST per convertire il corpo del messaggio da varbinary(max) in 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 nel modo più appropriato per l'applicazione. Gli errori con codici di errore negativi vengono generati da Service Broker, mentre quelli con codici positivi vengono generati dai programmi del servizio che ha eseguito END CONVERSATION WITH ERROR.

Esempio

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