Как извлечь данные из сообщения об ошибке компонента Service Broker (Transact SQL)

Сообщение типа https://schemas.microsoft.com/SQL/ServiceBroker/Error представляет собой сообщение об ошибке компонента Service Broker. Сообщения этого типа представляют собой XML-документы, содержащие цифровой код и описание ошибки.

Извлечение данных из сообщения об ошибке компонента Service Broker

  1. Объявите переменную типа int для хранения кода ошибки.

  2. Объявите переменную типа nvarchar(3000) для хранения описания ошибки.

  3. Объявите переменную типа xml для представления тела сообщения в формате XML.

  4. Преобразуйте текст сообщения из вида varbinary(max) к виду xml инструкцией CAST и присвойте результат переменной типа xml.

  5. С помощью функции value с типом данных xml извлеките код ошибки.

  6. С помощью функции value с типом данных xml извлеките описание ошибки.

  7. Обработайте ошибку в соответствии с требованиями приложения. Ошибки с отрицательным кодом формируются компонентом Service Broker, ошибки с положительным кодом формируются служебными программами.

Пример

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

См. также

Основные понятия

Сообщения компонента Service Broker

Другие ресурсы

Основы языка XQuery

Справка и поддержка

Получение помощи по SQL Server 2005