如何从 Service Broker 错误消息中检索信息 (Transact SQL)
类型为 https://schemas.microsoft.com/SQL/ServiceBroker/Error 的消息为 Service Broker 错误消息。此类型的消息为包含代表错误的数值代码及错误说明的 XML 文档。
从 Service Broker 错误消息中检索信息
声明一个 int 类型的变量来保存错误代码。
声明一个 nvarchar(3000) 类型的变量来保存错误说明。
声明一个 xml 类型的变量来保存消息正文的 XML 表示形式。
使用 CAST 将消息正文从 varbinary(max) 转换为 xml,并将结果分配给 xml 类型的变量。
使用 xml 数据类型的 value 函数检索错误代码。
使用 xml 数据类型的 value 函数检索错误说明。
按照适合于您应用程序的方法处理该错误。错误代码为负值的错误是由 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