Les erreurs générées par RAISERROR fonctionnent comme celles générées par le code du moteur de base de données. Les valeurs spécifies par RAISERROR sont signalées par les fonctions système ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY, ERROR_STATE et @@ERROR. Lorsque l'instruction RAISERROR est exécutée avec un niveau de gravité de minimum 11 dans un bloc TRY, elle transfère le contrôle au bloc CATCH associé. L'erreur est renvoyée à l'appelant si RAISERROR est exécutée :
-
en dehors du champ d'un bloc TRY ;
-
avec un niveau de gravité inférieur ou égal à 10 dans un bloc TRY ;
-
avec un degré de gravité supérieur ou égal à 20 qui met fin à la connexion à la base de données.
Les blocs CATCH peuvent utiliser RAISERROR pour relancer l'erreur qui a appelé le bloc CATCH à l'aide de fonctions système, telles que ERROR_NUMBER et ERROR_MESSAGE, afin de récupérer les données d'erreur originales. @@ERROR est défini par défaut sur 0 pour les messages dont le niveau de gravité est compris entre 1 et 10. Pour plus d'informations, consultez Utilisation de TRY...CATCH dans Transact-SQL.
Lorsque msg_id spécifie un message défini par l'utilisateur disponible à partir de l'affichage catalogue sys.messages, RAISERROR traite le message à partir de la colonne de texte à l'aide des mêmes règles que celles appliquées au texte d'un message défini par l'utilisateur à l'aide de msg_str. Le texte du message défini par l'utilisateur peut contenir des spécifications de conversion, dans lesquelles RAISERROR mappera les arguments. Utilisez sp_addmessage pour ajouter des messages d'erreur définis par l'utilisateur et sp_dropmessage pour en supprimer.
Vous pouvez également utiliser RAISERROR comme alternative à PRINT pour renvoyer des messages aux applications appelantes. Contrairement à l'instruction Transact-SQL, RAISERROR prend en charge la substitution de caractère proche de la fonctionnalité de la fonction printf dans la bibliothèque standard C. L'instruction PRINT n'est pas affectée par les blocs TRY, alors que si vous exécutez RAISERROR avec un degré de gravité compris entre 11 et 19 dans un bloc TRY, le contrôle est transféré vers le bloc CATCH associé. Spécifiez une gravité inférieure ou égale à 10 pour utiliser RAISERROR afin de renvoyer un message depuis un bloc TRY sans appeler le bloc CATCH.
En règle générale, des arguments successifs remplacent des spécifications de conversion successives ; le premier argument remplace la première spécification de conversion, le deuxième argument remplace la deuxième spécification, etc. Par exemple, dans l'instruction RAISERROR suivante, le premier argument N'number' remplace la première spécification de conversion %s et le deuxième argument 5 remplace la deuxième spécification de conversion %d.
RAISERROR (N'This is message %s %d.', -- Message text.
10, -- Severity,
1, -- State,
N'number', -- First argument.
5); -- Second argument.
-- The message text returned is: This is message number 5.
GO
Si un astérisque (*) est spécifié pour la largeur ou la précision d'une spécification de conversion, la valeur à utiliser pour la largeur ou la précision est un nombre entier. Dans ce cas, une spécification de conversion peut utiliser jusqu'à trois arguments : un pour la largeur, un pour la précision et un pour la valeur de substitution.
Par exemple, les deux instructions RAISERROR suivantes renvoient la même chaîne. L'une spécifie la largeur et la précision dans la liste d'arguments, tandis que l'autre les indique dans la spécification de conversion.
RAISERROR (N'<<%*.*s>>', -- Message text.
10, -- Severity,
1, -- State,
7, -- First argument used for width.
3, -- Second argument used for precision.
N'abcde'); -- Third argument supplies the string.
-- The message text returned is: << abc>>.
GO
RAISERROR (N'<<%7.3s>>', -- Message text.
10, -- Severity,
1, -- State,
N'abcde'); -- First argument supplies the string.
-- The message text returned is: << abc>>.
GO