Procédure : récupérer des informations à partir d'un message d'erreur Service Broker (Transact SQL)
Un message de type https://schemas.microsoft.com/SQL/ServiceBroker/Error est un message d'erreur Service Broker. Des messages de ce type sont des documents XML contenant une description de l'erreur et un code numérique pour celle-ci.
Pour récupérer les informations figurant dans un message d'erreur Service Broker
Déclarez une variable de type int pour connaître le code de l'erreur.
Déclarez une variable de type nvarchar(3000) pour prendre connaissance de la description de l'erreur.
Déclarez une variable de type xml pour vous procurer une version XML du corps du message.
Convertissez (CAST) le corps du message pour passer du type varbinary(max) au type xml, puis attribuez les résultats à la variable de type xml.
Utilisez la fonction value du type de données xml pour récupérer le code de l'erreur.
Utilisez la fonction value du type de données xml pour récupérer la description de l'erreur.
Corrigez l'erreur comme il convient pour votre application. Les erreurs dotées de codes d'erreur négatifs sont générées par Service Broker. Les erreurs dotées de codes d'erreur positifs sont générées par les programmes de service ayant exécuté END CONVERSATION WITH ERROR.
Exemple
-- 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