Как извлечь данные из сообщения об ошибке компонента Service Broker (Transact SQL)
Сообщение типа https://schemas.microsoft.com/SQL/ServiceBroker/Error представляет собой сообщение об ошибке компонента Service Broker. Сообщения этого типа представляют собой XML-документы, содержащие цифровой код и описание ошибки.
Извлечение данных из сообщения об ошибке компонента Service Broker
Объявите переменную типа int для хранения кода ошибки.
Объявите переменную типа nvarchar(3000) для хранения описания ошибки.
Объявите переменную типа xml для представления тела сообщения в формате XML.
Преобразуйте текст сообщения из вида varbinary(max) к виду xml инструкцией CAST и присвойте результат переменной типа xml.
С помощью функции value с типом данных xml извлеките код ошибки.
С помощью функции value с типом данных xml извлеките описание ошибки.
Обработайте ошибку в соответствии с требованиями приложения. Сообщения с отрицательными кодами создаются компонентом Service Broker. Сообщения с положительными кодами создаются служебными программами, в которых выполняется инструкция END CONVERSATION WITH ERROR.
Пример
-- 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
См. также