Instructions SQL Server PRINT et SQL Server RAISERROR – Serveur d’impression
Cet article explore les instructions SQL Server PRINT et ses autres instructions SQL Server RAISEERROR à imprimer
messages dans une requête.
Sommaire
introduction
Supposons que vous exécutiez une requête en plusieurs étapes. Nous voulons recevoir un message une fois chaque étape terminée. Il permet de suivre la progression de la requête. Habituellement, nous utilisons l'instruction SQL PRINT pour imprimer les messages correspondants ou suivre les valeurs des variables pendant la progression de la requête.
Nous utilisons également des interactions ou plusieurs boucles dans une requête avec un certain temps ou pour une boucle. Nous pouvons également utiliser le SQL PRINT
pour suivre l'itération.
Nous utilisons l'instruction SQL Server PRINT pour renvoyer des messages au client. Nous spécifions le message comme entrée d'expressions de chaîne. SQL Server renvoie le message à l'application.
Dans cet article, nous allons explorer plusieurs cas d'utilisation de l'instruction SQL PRINT, ses limitations et alternatives à SQL
Instructions PRINT.
Exemple 1: instruction SQL Server PRINT pour imprimer une chaîne
C'est l'exemple le plus simple. Exécutez la requête suivante dans SSMS et elle renvoie le message suivant dans la sortie:
IMPRESSION «Mon nom est Rajendra Gupta»; |
Dans SSMS, nous obtenons la sortie de l'instruction PRINT dans la fenêtre de message SSMS comme indiqué dans l'image ci-dessus.
Exemple 2: instruction PRINT pour imprimer une valeur de variable
Nous pouvons également utiliser l'instruction SQL PRINT pour imprimer une valeur variable. Définissons un message dans une variable et plus tard
imprimer ce message:
DÉCLARER @Msg VARCHAR(300)= «Mon nom est Rajendra Gupta»; IMPRESSION @Msg; |
Exemple 3: instruction SQL Server PRINT pour imprimer une valeur entière
Nous pouvons utiliser l'instruction SQL PRINT pour imprimer une valeur entière, comme indiqué ci-dessous:
DÉCLARER @une INT = 1000 IMPRESSION @une |
Nous pouvons spécifier uniquement les types de données CHAR, NCHAR, VARCHAR ou NVARCHAR dans l'instruction PRINT. Dans ce cas, il convertit implicitement une valeur entière en type de données VARCHAR en interne.
Prenons un autre exemple avec une variable entière et une chaîne dans l'instruction PRINT. Vous obtenez un message d'erreur dans
conversion de type de données car SQL Server tente de convertir le type de données varchar en entier. Dans le type de données
priorité, le type de données entier a une priorité élevée par rapport au type de données varchar:
DÉCLARER @une INT = 1000 IMPRESSION «Votre file d'attente n'est pas» + @une |
Nous convertissons explicitement le type de données entier en varchar à l'aide de l'instruction SQL CAST:
DÉCLARER @une INT= 1000; IMPRESSION «Votre file d'attente n'est pas» + JETER(@une COMME VARCHAR(dix)); |
Nous pouvons également utiliser la fonction SQL CONCAT, et elle effectue automatiquement la conversion du type de données pour nous. Dans ce qui suit
requête, nous obtenons la sortie en utilisant la fonction CONCAT similaire à l'opérateur CAST:
DÉCLARER @une INT= 1000; IMPRESSION CONCAT('Votre file d'attente n'est pas:',@une) |
Exemple 4: instruction SQL Server PRINT avec une valeur de variable de type XML
Nous pouvons également utiliser le type de données XML avec l'instruction PRINT, mais cela nécessite une conversion des données.
Comme le montre la sortie suivante, nous ne pouvons pas utiliser directement une variable XML dans l'instruction PRINT. Cela donne une erreur
message indiquant qu'une conversion implicite de XML vers nvarchar n'est pas autorisée:
DÉCLARER @une XML = " IMPRESSION @une |
Nous pouvons utiliser la fonction SQL CAST ou CONVERT explicitement et obtenir la sortie requise:
@une XML = " IMPRESSION JETER(@une COMME VARCHAR(100)) |
Exemple 5: instruction SQL Server PRINT avec des conditions IF
Utilisons l'instruction PRINT pour imprimer le message satisfait dans la condition IF. Dans cet exemple, la variable @a
contient une chaîne. La condition IF vérifie la chaîne et affiche un message satisfaisant la condition:
DÉCLARER @une VARCHAR(100)= 'Mangue'; SI @une = 'Mangue' IMPRESSION N«C'est un fruit»; AUTRE IMPRESSION N«C'est un légume»; ALLER |
Exemple 6: instruction PRINT avec des valeurs NULL
Nous ne pouvons pas imprimer NULL dans le message à l'aide de l'instruction SQL PRINT. La requête suivante ne renvoie aucun résultat:
Utilisons la requête suivante qui contient une variable avec des valeurs NULL. Dans l'instruction PRINT, nous utilisons une chaîne
avec cette variable, et elle ne renvoie aucun message. La concaténation d'une chaîne et de la variable @a
(NULL) qui ne renvoie aucune sortie:
DÉCLARER @une NVarChar(100)= NUL IMPRESSION 'Bonjour' + @une |
Exemple 7: instruction SQL Server PRINT dans une boucle WHILE
Comme indiqué précédemment, plusieurs fois, nous avons besoin de connaître les informations sur chaque itération lors de l'exécution d'une requête dans une boucle telle que WHILE ou FOR.
La requête suivante utilise la boucle WHILE et affiche un message sur chaque itération:
DÉCLARER @une INT; ENSEMBLE @une = 1; TANDIS QUE(@une < dix) COMMENCER IMPRESSION CONCAT('Ceci est le numéro d'itération:' , @une) ENSEMBLE @une = @une + 1; FIN; |
Il donne la sortie suivante. Nous pouvons utiliser une instruction Print avec un message approprié et suivre la progression de la requête.
Limitations de l'instruction SQL Server PRINT
Dans l'exemple précédent, nous avons vu l'utilisation de cas d'instructions SQL PRINT. Nous avons les limitations suivantes avec
IMPRIMER aussi:
-
Nous devons utiliser les fonctions CAST, CONVERT ou CONCAT dans l'instruction PRINT avec des variables
-
Nous ne pouvons pas voir une instruction PRINT dans SQL PROFILER
-
L'instruction PRINT ne renvoie pas le message immédiatement; il met en tampon la sortie et les affiche
Élaborons le point n ° 3 et voyons ses alternatives.
Exécutez la requête suivante qui contient deux instructions PRINT. En regardant la requête, vous pourriez penser à la sortie dans
le formulaire suivant:
-
Il donne le message de la première instruction PRINT
-
Attend 5 secondes
-
Il donne le message pour une deuxième instruction PRINT
-
Attend encore 5 secondes
IMPRESSION «Mon nom est Rajendra Gupta»; ATTENDRE RETARD «00: 00: 05»; IMPRESSION «Vous lisez un article sur l'instruction SQL PRINT»; ATTENDRE RETARD «00: 00: 05»; |
Dans l'image GIF suivante, vous pouvez noter qu'il imprime le message des deux instructions SQL PRINT ensemble après 10
secondes:
Prenons un autre exemple et voyons le comportement de l'instruction PRINT. En cela, nous voulons imprimer le message dès que
l'itération se termine:
DÉCLARER @une INT; ENSEMBLE @une = 1; TANDIS QUE(@une < 15) COMMENCER IMPRESSION CONCAT('Ceci est le numéro d'itération:' , @une) ATTENDRE RETARD «00: 00: 01» ENSEMBLE @une = @une + 1; FIN; |
Dans la sortie, nous pouvons noter que tous les messages sortis des instructions PRINT apparaissent ensemble une fois l'exécution
se termine. La boucle s'exécute 14 fois et attend 1 seconde à chaque exécution. Par conséquent, nous obtenons une sortie après 14
secondes pour toutes les instructions PRINT:
SQL Server met en mémoire tampon les messages pour plusieurs instructions PRINT et les affiche ensemble.
Ce n'est pas la sortie souhaitée, et en tout cas, cela peut ne pas être utile car vous ne pouvez pas suivre la progression de la requête dans
temps réel.
Instruction RAISERROR SQL Server
Nous pouvons utiliser une alternative à l'instruction SQL PRINT qui est RAISERROR.
Nous avons besoin de quelques arguments dans les instructions RAISERROR.
- Message – C'est le message que nous voulons imprimer
- Gravité – Il s'agit d'un nombre compris entre 0 et 25 et définit la gravité des messages. Il traite
le message différemment avec chaque gravité. Nous en verrons quelques exemples dans cet article - Etat – C'est un nombre compris entre 0 et 255 pour distinguer une erreur d'une autre. C'est bon de
utilisez la valeur 1 pour cet article
Nous devons utiliser l'instruction RAISERROR avec la clause NOWAIT; sinon, il montre le même comportement que pour SQL PRINT
déclaration:
RAISERROR(«Mon nom est Rajendra Gupta», 0, 1) AVEC NON ATTENDS; ATTENDRE RETARD «00: 00: 05»; RAISERROR(«Vous lisez un article sur l'instruction SQL PRINT», 0, 1) AVEC NON ATTENDS; ATTENDRE RETARD «00: 00: 05»; |
Dans la sortie suivante avec les instructions SQL Server RAISERROR, nous pouvons noter les éléments suivants:
-
Il donne le message de la première instruction PRINT
-
Attend 5 secondes
-
Il donne le message pour la deuxième instruction PRINT
-
Attend encore 5 secondes
Auparavant, nous utilisions la gravité 0 dans l'instruction RAISERROR. Utilisons la même requête avec la gravité 16:
RAISERROR(«Mon nom est Rajendra Gupta», 16, 1) AVEC NON ATTENDS; ATTENDRE RETARD «00: 00: 05»; RAISERROR(«Vous lisez un article sur l'instruction SQL PRINT», 16, 1) AVEC NON ATTENDS; ATTENDRE RETARD «00: 00: 05»; |
Dans la sortie, nous pouvons voir que le message apparaît en rouge, et il montre le message comme une erreur au lieu d'un message normal. Vous obtenez également l'identifiant, le niveau et l'état du message:
Exécutons la requête suivante avec la gravité 1 et la gravité 16. La gravité 1 affiche le message avec des informations supplémentaires, mais il ne l'affiche pas comme une erreur. Vous pouvez voir la couleur du texte en noir.
Un autre SQL Server RAISERROR affiche le message de sortie comme une erreur:
RAISERROR(«Mon nom est Rajendra Gupta», 1, 1) AVEC NON ATTENDS; ATTENDRE RETARD «00: 00: 05»; RAISERROR(«Vous lisez un article sur l'instruction SQL PRINT», 16, 1) AVEC NON ATTENDS; ATTENDRE RETARD «00: 00: 05»; |
Nous ne pouvons pas utiliser SQL Server RAISERROR directement à l'aide des variables. Nous obtenons la sortie suivante qui n'est pas celle souhaitée
production:
DÉCLARER @une INT; ENSEMBLE @une = 1; TANDIS QUE(@une < 15) COMMENCER RAISERROR('Ceci est le numéro d'itération:', @UNE, 0, 1) AVEC NON ATTENDS; ENSEMBLE @une = @une + 1; FIN; |
Il imprime le message mais n'affiche pas la valeur de la variable:
Nous devons utiliser les instructions d'impression de style C avec RAISERROR. La requête suivante montre la variable avec le
RAISERROR. Vous pouvez remarquer que nous utilisons% s et% d pour imprimer une chaîne et une valeur entière:
DÉCLARER @une INT; ENSEMBLE @une = 1; DÉCLARER @S VARCHAR(100)= «Ceci est l'itération non»; TANDIS QUE(@une < 5) COMMENCER RAISERROR('%Dakota du Sud', 0, 1, @s, @une) AVEC NON ATTENDS; ENSEMBLE @une = @une + 1; FIN; |
Nous obtenons la sortie instantanée dans SQL Server RAISERROR avec l'instruction WITH NOWAIT selon nos besoins et ne
ne pas utiliser de tampon pour afficher la sortie une fois la requête terminée:
Vous pouvez confondre l'instruction RAISERROR avec laquelle elle sert à générer des messages d'erreur dans SQL Server. Nous pouvons également l'utiliser comme alternative à l'instruction SQL PRINT. Habituellement, les développeurs n'utilisent les instructions PRINT que pour envoyer des messages dans une requête. Vous devez explorer les instructions RAISERROR pour vos requêtes, procédures stockées.
Conclusion
Dans cet article, nous avons exploré l'instruction SQL Server PRINT et ses utilisations pour suivre les jalons utiles dans une requête. Nous avons également appris ses limites avec l'instruction alternative RAISERROR de la solution dans SQL Server. serveur SQL
RAISERROR vous offre un grand avantage pour contrôler le comportement du tampon de sortie.
Rajendra Gupta
Tout en travaillant en tant que consultant senior DBA pour les gros clients et en étant certifié MCSA SQL 2012, il aime partager ses connaissances sur différents blogs.
On peut le joindre à rajendra.gupta16@gmail.com
Voir tous les articles de Rajendra Gupta
Commentaires
Laisser un commentaire