{"version":"1.1","schema_version":"1.1.0","plugin_version":"1.1.2","url":"https://tutos-gameserver.fr/2020/05/08/gestion-des-erreurs-dans-sql-server-2012-bien-choisir-son-serveur-d-impression/","llm_html_url":"https://tutos-gameserver.fr/2020/05/08/gestion-des-erreurs-dans-sql-server-2012-bien-choisir-son-serveur-d-impression/llm","llm_json_url":"https://tutos-gameserver.fr/2020/05/08/gestion-des-erreurs-dans-sql-server-2012-bien-choisir-son-serveur-d-impression/llm.json","manifest_url":"https://tutos-gameserver.fr/llm-endpoints-manifest.json","language":"fr-FR","locale":"fr_FR","title":"Gestion des erreurs dans SQL Server 2012\n\n &#8211; Bien choisir son serveur d impression","site":{"name":"Tutos GameServer","url":"https://tutos-gameserver.fr/"},"author":{"id":1,"name":"Titanfall","url":"https://tutos-gameserver.fr/author/titanfall/"},"published_at":"2020-05-08T06:12:11+00:00","modified_at":"2020-05-08T06:12:11+00:00","word_count":2446,"reading_time_seconds":734,"summary":"Depuis la sortie de SQL Server 2005, vous pouvez gérer les erreurs dans votre code T-SQL en incluant un ESSAYEZ &#8230; bloc qui contrôle le flux de votre script en cas d&#39;erreur, semblable à la façon dont les langages procéduraux ont traditionnellement traité les erreurs. le ESSAYEZ &#8230; Le bloc facilite le retour ou l&#39;audit [&hellip;]","summary_points":["Depuis la sortie de SQL Server 2005, vous pouvez gérer les erreurs dans votre code T-SQL en incluant un ESSAYEZ &#8230; bloc qui contrôle le flux de votre script en cas d&#39;erreur, semblable à la façon dont les langages procéduraux ont traditionnellement traité les erreurs.","le ESSAYEZ &#8230; Le bloc facilite le retour ou l&#39;audit des données liées aux erreurs, ainsi que la prise d&#39;autres mesures.","Et dans le bloc en particulier, le CAPTURE portion-vous avez pu inclure un RAISERROR afin de renvoyer les données relatives aux erreurs à l&#39;application appelante.","Cependant, avec la version de SQL Server 2012, vous disposez désormais d&#39;un remplacement pour RAISERROR, le JETER , ce qui facilite plus que jamais la capture des données d&#39;erreur."],"topics":["Serveur d'impression"],"entities":[],"entities_metadata":[{"id":10,"name":"Serveur d'impression","slug":"serveur-dimpression","taxonomy":"category","count":3907,"url":"https://tutos-gameserver.fr/category/serveur-dimpression/"}],"tags":["Serveur d'impression"],"content_hash":"bbf0096008b8569b2d78da7017313164","plain_text":"Depuis la sortie de SQL Server 2005, vous pouvez gérer les erreurs dans votre code T-SQL en incluant un ESSAYEZ &#8230; bloc qui contrôle le flux de votre script en cas d&#39;erreur, semblable à la façon dont les langages procéduraux ont traditionnellement traité les erreurs. le ESSAYEZ &#8230; Le bloc facilite le retour ou l&#39;audit des données liées aux erreurs, ainsi que la prise d&#39;autres mesures. Et dans le bloc en particulier, le CAPTURE portion-vous avez pu inclure un RAISERROR afin de renvoyer les données relatives aux erreurs à l&#39;application appelante. Cependant, avec la version de SQL Server 2012, vous disposez désormais d&#39;un remplacement pour RAISERROR, le JETER , ce qui facilite plus que jamais la capture des données d&#39;erreur. \nDans cet article, nous allons voir le ESSAYEZ &#8230; bloc utilisé avec le RAISERROR et JETER déclarations. Les exemples sont basés sur un tableau que j&#39;ai créé dans le AdventureWorks2012 exemple de base de données, sur une instance locale de SQL Server 2012. Le listing 1 montre le script T-SQL que j&#39;ai utilisé pour créer le LastYearSales table. \n\n\n\n\n\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\ndix\n11\n12\n13\n14\n15\n16\n17\n18\n\n\n\n\nUTILISATION AdventureWorks2012;\nALLER\n\nSI OBJECT_ID(«LastYearSales», «U») EST NE PAS NUL\nLAISSEZ TOMBER TABLE LastYearSales;\nALLER\n\nSÉLECTIONNER\n  BusinessEntityID COMME SalesPersonID,\n  Prénom + &#39;&#39; + Nom de famille COMME Nom complet,\n  SalesLastYear\nDANS\n  LastYearSales\nDE\n  Ventes.vSalesPerson\nOÙ\n  SalesLastYear &gt; 0;\nALLER\n\n\n\n\n\n\nListing 1: Création de la table LastYearSales \nLe script devrait être assez simple. J&#39;utilise un CHOISIR… DANS pour récupérer les données de la Sales.vSalesPerson la visualiser et l&#39;insérer dans la table nouvellement créée. Cependant, pour montrer comment gérer les erreurs, nous devons ajouter un élément de plus à notre table: une contrainte de vérification qui garantit la SalesLastYear la valeur n&#39;est jamais inférieure à zéro. Le listing 2 montre le MODIFIER TABLE J&#39;ai utilisé pour ajouter la contrainte. \n\n\n\n\n\n\n\n\n\nMODIFIER TABLE LastYearSales\nAJOUTER CONTRAINTE ckSalesTotal VÉRIFIER (SalesLastYear &gt; = 0);\nALLER\n\n\n\n\n\n\nListing 2: Ajout d&#39;une contrainte de vérification à la table LastYearSales \nLa contrainte facilite la génération d&#39;une erreur lors de la mise à jour de la table. Tout ce que je dois faire, c&#39;est essayer d&#39;ajouter un montant négatif au SalesLastYear , un montant suffisamment élevé pour que SQL Server génère une erreur. Une fois que nous avons créé notre table et ajouté la contrainte de vérification, nous avons l&#39;environnement dont nous avons besoin pour les exemples de cet article. Vous pouvez tout aussi facilement créer votre propre table et l&#39;utiliser dans les exemples. Assurez-vous simplement d&#39;avoir un moyen de violer une contrainte ou de trouver un autre mécanisme pour générer une erreur. Le but est de créer un script qui gère toutes les erreurs. \nUne fois que nous avons configuré notre table, l&#39;étape suivante consiste à créer une procédure stockée qui montre comment gérer les erreurs. La procédure, UpdateSales, modifie la valeur dans le SalesLastYear dans la colonne LastYearSales table pour un vendeur spécifié. Il fonctionne en ajoutant ou en soustrayant un montant de la valeur actuelle dans cette colonne. Le listing 3 montre le script que j&#39;ai utilisé pour créer la procédure. Notez que j&#39;inclus deux paramètres d&#39;entrée-@SalesPersonID et @SalesAmt-qui coïncident avec la table SalesPersonID et SalesLastYear Colonnes. \n\n\n\n\n\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\ndix\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n\n\n\n\nUTILISATION AdventureWorks2012;\nALLER\n\nSI OBJECT_ID(«UpdateSales», «P») EST NE PAS NUL\nLAISSEZ TOMBER PROCÉDURE UpdateSales;\nALLER\n\nCRÉER PROCÉDURE UpdateSales\n  @SalesPersonID INT,\n  @SalesAmt ARGENT = 0\nCOMME\nCOMMENCER\n  COMMENCER ESSAYER\n    COMMENCER TRANSACTION;\n      MISE À JOUR LastYearSales\n      ENSEMBLE SalesLastYear = SalesLastYear + @SalesAmt\n      OÙ SalesPersonID = @SalesPersonID;\n    COMMETTRE TRANSACTION;\n  FIN ESSAYER\n  COMMENCER CAPTURE\n    SI @@TRANCOUNT &gt; 0\n    RETOUR EN ARRIERE TRANSACTION;\n\n    DÉCLARER @ErrorNumber INT = ERROR_NUMBER();\n    DÉCLARER @ErrorLine INT = ERROR_LINE();\n    DÉCLARER @Message d&#39;erreur NVARCHAR(4000) = MESSAGE D&#39;ERREUR();\n    DÉCLARER @ErrorSeverity INT = ERROR_SEVERITY();\n    DÉCLARER @ErrorState INT = ERROR_STATE();\n\n    IMPRESSION &#39;Numéro d&#39;erreur réel:&#39; + JETER(@ErrorNumber COMME VARCHAR(dix));\n    IMPRESSION &#39;Numéro de ligne réel:&#39; + JETER(@ErrorLine COMME VARCHAR(dix));\n\n    RAISERROR(@Message d&#39;erreur, @ErrorSeverity, @ErrorState);\n  FIN CAPTURE\nFIN;\nALLER\n\n\n\n\n\n\nListing 3: Création d&#39;une procédure stockée contenant un bloc Try… Catch \nLe corps principal de la définition de la procédure, inclus dans le COMMENCER… FIN bloc, contient le ESSAYEZ &#8230; bloc, lui-même divisé en ESSAYER bloc et CAPTURE bloquer. le ESSAYER le bloc commence par DÉBUT et se termine par ENDTRY et contient le T-SQL nécessaire pour exécuter les actions de la procédure. Dans ce cas, j&#39;inclus un MISE À JOUR déclaration qui ajoute le @Montant des ventes valeur à la SalesLastYear colonne. La déclaration est incluse dans DÉBUT DE TRANSACTION et COMMITTRANSACTION pour démarrer et valider explicitement la transaction. Les exemples varient en fonction de l&#39;endroit où ils incluent les déclarations relatives aux transactions. (Certains n&#39;incluent pas du tout les relevés.) Gardez simplement à l&#39;esprit que vous souhaitez valider ou annuler vos transactions aux moments appropriés, selon qu&#39;une erreur a été générée. \nSi la MISE À JOUR s&#39;exécute avec succès, le SalesLastYear est mise à jour et l&#39;opération est terminée, auquel cas le code dans le CAPTURE le bloc n&#39;est jamais exécuté. Cependant, si le MISE À JOUR échoue et SQL Server génère une erreur, la transaction est terminée et le moteur de base de données passe à la CAPTURE bloquer. le CAPTURE le bloc commence par BEGINCATCH et se termine par ENDCATCH et contient les instructions nécessaires pour gérer l&#39;erreur. \nPour la procédure stockée dans le Listing 3, la première étape que je prends dans le CAPTURE le bloc consiste à annuler la transaction si elle est toujours en cours d&#39;exécution. Je commence par utiliser le @@ TRANCOUNT pour déterminer si des transactions sont encore ouvertes. @@ TRANCOUNT est une fonction SQL Server intégrée qui renvoie le nombre de transactions en cours d&#39;exécution dans la session en cours. Dans ce cas, il ne devrait y en avoir qu&#39;un (si une erreur se produit), donc j&#39;annule cette transaction. \nEnsuite, je déclare un ensemble de variables basées sur les fonctions système que SQL Server met à disposition dans le cadre de la CAPTURE bloquer. Les fonctions renvoient des informations relatives aux erreurs que vous pouvez référencer dans vos instructions T-SQL. Actuellement, SQL Server prend en charge les fonctions suivantes à cette fin: \n\nERROR_NUMBER (): Le numéro attribué à l&#39;erreur.  \nERROR_LINE (): Numéro de ligne dans la routine qui a provoqué l&#39;erreur.  \nMESSAGE D&#39;ERREUR(): Le texte du message d&#39;erreur, qui inclut les valeurs fournies pour tous les paramètres substituables, tels que les heures ou les noms d&#39;objets.  \nERROR_SEVERITY (): La gravité de l&#39;erreur.  \nERROR_STATE (): Numéro d&#39;état de l&#39;erreur.  \nERROR_PROCEDURE (): Nom de la procédure stockée ou du déclencheur qui a généré l&#39;erreur. \n\nPour cet exemple, j&#39;utilise toutes les fonctions sauf la dernière, mais dans un environnement de production, vous pouvez également utiliser celle-ci. \nAprès avoir déclaré les variables, j&#39;inclus deux IMPRESSION des instructions qui affichent les valeurs de la @ErrorNumber et @ErrorLine variables (avec un texte explicatif). La raison pour laquelle je fais cela est de démontrer la différence entre ce que sont les valeurs réelles et ce que le RAISERROR comme vous le verrez sous peu. \nle RAISERROR déclaration vient après la IMPRESSION déclarations. L&#39;instruction renvoie des informations d&#39;erreur à l&#39;application appelante. Généralement, lors de l&#39;utilisation RAISERROR, vous devez inclure un message d&#39;erreur, un niveau de gravité d&#39;erreur et un état d&#39;erreur. Les règles qui régissent le RAISERROR les arguments et les valeurs qu&#39;ils renvoient sont un peu complexes et dépassent le cadre de cet article, mais pour les besoins de cet exemple, je passe simplement @Message d&#39;erreur, @ErrorSeverity, et @ErrorState variables comme arguments. \n\nREMARQUE: Pour plus d&#39;informations sur l&#39;instruction RAISERROR, consultez la rubrique «RAISERROR (Transact-SQL)» dans la documentation en ligne de SQL Server. \n\nC&#39;est tout ce que vous devez faire pour créer une procédure stockée contenant un ESSAYEZ &#8230; bloquer. Dans un instant, nous allons essayer notre travail. Mais d&#39;abord, récupérons une ligne de la LastYearSales tableau pour voir quelle est la valeur actuelle pour le vendeur 288. Le listing 4 montre le SÉLECTIONNER J&#39;ai utilisé pour récupérer les données. \n\n\n\n\n\n\n\n\n\nSÉLECTIONNER Nom complet, SalesLastYear\nDE LastYearSales\nOÙ SalesPersonID = 288\n\n\n\n\n\n\nListing 4: Récupération de la date dans la table LastYearSales \nSans surprise, la déclaration renvoie le nom et les ventes totales de ce vendeur, comme indiqué dans le listing 5. Comme vous pouvez le voir, Rachel Valdez affiche plus de 1,3 million de dollars de ventes pour l&#39;année dernière. \n\n\n\n\n\n\n\n\n\nNom complet\t\tSalesLastYear\nRachel Valdez\t\t1307949.7917\n\n\n\n\n\n\nListing 5: Données extraites de la table LastYearSales \nEssayons maintenant le UpdateSales procédure stockée. Juste pour le plaisir, ajoutons quelques millions de dollars aux totaux de Rachel Valdez. Le listing 6 montre comment j&#39;utilise le EXEC déclaration pour appeler la procédure et transmettre l&#39;ID du vendeur et les 2 millions de dollars. \n\n\n\n\n\n\n\n\n\nEXEC UpdateSales 288, 2000000;\n\n\n\n\n\n\nListing 6: Exécution de la procédure stockée UpdateSales \nLa procédure stockée doit s&#39;exécuter sans problème car nous ne violons pas la contrainte de vérification. Si nous devions exécuter la SÉLECTIONNER à nouveau (celle de l&#39;extrait 4), nos résultats ressembleraient à ceux de l&#39;extrait 7. Notez tout l&#39;argent supplémentaire. \n\n\n\n\n\n\n\n\n\nNom complet\t\tSalesLastYear\nRachel Valdez\t\t3307949.7917\n\n\n\n\n\n\nListing 7: Affichage du montant des ventes mis à jour dans le tableau LastYearSales \nVoyons maintenant ce qui se passe si nous soustrayons suffisamment de son compte pour ramener ses totaux en dessous de zéro. Dans la liste 8, je lance à nouveau la procédure, mais cette fois précisez -4000000 pour le montant. \n\n\n\n\n\n\n\n\n\nEXEC UpdateSales 288, &#8211;4000000;\n\n\n\n\n\n\nListing 8: Causer la procédure stockée UpdateSales pour générer une erreur \nComme vous vous en souvenez, après avoir créé le LastYearSales table, j&#39;ai ajouté une contrainte de vérification pour s&#39;assurer que le montant ne pouvait pas tomber en dessous de zéro. Par conséquent, la procédure stockée génère maintenant une erreur, qui est indiquée dans le listing 9. \n\n\n\n\n\n\n\n\n\n (0 rangée(s) affecté)\nRéel Erreur nombre: 547\nRéel ligne nombre: 9\nMsg 50000, Niveau 16, Etat 0, Procédure UpdateSales, Ligne 27\nle MISE À JOUR déclaration en conflit avec le VÉRIFIER contrainte &quot;ckSalesTotal&quot;. le conflit eu lieu dans base de données &quot;AdventureWorks2012&quot;, table &quot;dbo.LastYearSales&quot;, colonne «SalesLastYear».\n\n\n\n\n\n\nListing 9: Le message d&#39;erreur renvoyé par la procédure stockée UpdateSales \nComme prévu, les informations que nous avons incluses dans le CAPTURE bloc a été retourné. Mais notez que le numéro d&#39;erreur réel (547) est différent du RAISERROR numéro de message (50000) et que le numéro de ligne réel (9) est différent du RAISERROR numéro de ligne (27). En théorie, ces valeurs devraient coïncider. Mais comme je l&#39;ai mentionné plus tôt, les règles qui régissent RAISERROR sont un peu excentriques. \nPour simplifier le renvoi d&#39;erreurs dans un CAPTURE bloc, SQL Server 2012 a introduit le JETER déclaration. Avec le JETER , vous n&#39;avez pas besoin de spécifier de paramètres et les résultats sont plus précis. Vous incluez simplement la déclaration telle quelle dans le CAPTURE bloquer. \n\nREMARQUE: Vous pouvez utiliser le JETER déclaration en dehors de la CAPTURE bloc, mais vous devez inclure des valeurs de paramètre pour ce faire. Pour plus d&#39;informations sur le JETER , consultez la rubrique «THROW (Transact-SQL)» dans la documentation en ligne de SQL Server. \n\nPour démontrer la JETER déclaration, j&#39;ai défini un ALTER PROCEDURE déclaration qui modifie la UpdateSales procédure, en particulier la CAPTURE bloc, comme indiqué dans l&#39;extrait 10. \n\n\n\n\n\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\ndix\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n\n\n\n\nMODIFIER PROCÉDURE UpdateSales\n  @SalesPersonID INT,\n  @SalesAmt ARGENT = 0\nCOMME\nCOMMENCER\n  COMMENCER ESSAYER\n    COMMENCER TRANSACTION;\n      MISE À JOUR LastYearSales\n      ENSEMBLE SalesLastYear = SalesLastYear + @SalesAmt\n      OÙ SalesPersonID = @SalesPersonID;\n    COMMETTRE TRANSACTION;\n  FIN ESSAYER\n  COMMENCER CAPTURE\n    SI @@TRANCOUNT &gt; 0\n    RETOUR EN ARRIERE TRANSACTION;\n\n    DÉCLARER @ErrorNumber INT = ERROR_NUMBER();\n    DÉCLARER @ErrorLine INT = ERROR_LINE();\n\n    IMPRESSION &#39;Numéro d&#39;erreur réel:&#39; + JETER(@ErrorNumber COMME VARCHAR(dix));\n    IMPRESSION &#39;Numéro de ligne réel:&#39; + JETER(@ErrorLine COMME VARCHAR(dix));\n\n    JETER;\n  FIN CAPTURE\nFIN;\nALLER\n\n\n\n\n\n\nListing 10: Modification de la procédure stockée UpdateSales \nNotez que je conserve le @ErrorNumber et @ErrorLine déclarations de variables et leurs connexes IMPRESSION déclarations. Je le fais uniquement pour démontrer la JETER l&#39;exactitude de la déclaration. En fait, je dois seulement annuler la transaction et spécifier le JETER , sans aucun paramètre. \nMaintenant, exécutons à nouveau la procédure stockée, en essayant à nouveau de déduire 4 millions de dollars du montant des ventes, comme indiqué dans le listing 11. \n\n\n\n\n\n\n\n\n\nEXEC UpdateSales 288, &#8211;4000000;\n\n\n\n\n\n\nListing 11: Causer la procédure stockée UpdateSales pour générer une erreur \nUne fois de plus, SQL Server renvoie une erreur. Seulement cette fois, les informations sont plus précises. Comme vous pouvez le voir dans l&#39;extrait 12, les numéros de message et les numéros de ligne correspondent désormais. Nous n&#39;avons plus besoin de déclarer des variables ou d&#39;appeler des fonctions système pour renvoyer des informations relatives aux erreurs à l&#39;application appelante. \n\n\n\n\n\n\n\n\n\n (0 rangée(s) affecté)\nRéel Erreur nombre: 547\nRéel ligne nombre: 8\nMsg 547, Niveau 16, Etat 0, Procédure UpdateSales, Ligne 8\nle MISE À JOUR déclaration en conflit avec le VÉRIFIER contrainte &quot;ckSalesTotal&quot;. le conflit eu lieu dans base de données &quot;AdventureWorks2012&quot;, table &quot;dbo.LastYearSales&quot;, colonne «SalesLastYear».\n\n\n\n\n\n\nListing 12: Le message d&#39;erreur renvoyé par la procédure stockée UpdateSales \nComme vous pouvez le voir, SQL Server 2012 rend la gestion des erreurs plus facile que jamais. Même si vous utilisez le ESSAYEZ &#8230; bloquer pendant un certain temps, le JETER déclaration devrait prouver un grand avantage sur RAISERROR. Et si vous débutez dans la gestion des erreurs dans SQL Server, vous constaterez que le ESSAYEZ &#8230; bloc et JETER ensemble, le processus est assez indolore, il vaut bien le temps et les efforts nécessaires pour les apprendre et les mettre en œuvre. \n\n\nClick to rate this post!\r\n                                   \r\n                               [Total: 0  Average: 0]","paragraphs":["Depuis la sortie de SQL Server 2005, vous pouvez gérer les erreurs dans votre code T-SQL en incluant un ESSAYEZ &#8230; bloc qui contrôle le flux de votre script en cas d&#39;erreur, semblable à la façon dont les langages procéduraux ont traditionnellement traité les erreurs. le ESSAYEZ &#8230; Le bloc facilite le retour ou l&#39;audit des données liées aux erreurs, ainsi que la prise d&#39;autres mesures. Et dans le bloc en particulier, le CAPTURE portion-vous avez pu inclure un RAISERROR afin de renvoyer les données relatives aux erreurs à l&#39;application appelante. Cependant, avec la version de SQL Server 2012, vous disposez désormais d&#39;un remplacement pour RAISERROR, le JETER , ce qui facilite plus que jamais la capture des données d&#39;erreur. \nDans cet article, nous allons voir le ESSAYEZ &#8230; bloc utilisé avec le RAISERROR et JETER déclarations. Les exemples sont basés sur un tableau que j&#39;ai créé dans le AdventureWorks2012 exemple de base de données, sur une instance locale de SQL Server 2012. Le listing 1 montre le script T-SQL que j&#39;ai utilisé pour créer le LastYearSales table.","1\n2\n3\n4\n5\n6\n7\n8\n9\ndix\n11\n12\n13\n14\n15\n16\n17\n18","UTILISATION AdventureWorks2012;\nALLER","SI OBJECT_ID(«LastYearSales», «U») EST NE PAS NUL\nLAISSEZ TOMBER TABLE LastYearSales;\nALLER","SÉLECTIONNER\n  BusinessEntityID COMME SalesPersonID,\n  Prénom + &#39;&#39; + Nom de famille COMME Nom complet,\n  SalesLastYear\nDANS\n  LastYearSales\nDE\n  Ventes.vSalesPerson\nOÙ\n  SalesLastYear &gt; 0;\nALLER","Listing 1: Création de la table LastYearSales \nLe script devrait être assez simple. J&#39;utilise un CHOISIR… DANS pour récupérer les données de la Sales.vSalesPerson la visualiser et l&#39;insérer dans la table nouvellement créée. Cependant, pour montrer comment gérer les erreurs, nous devons ajouter un élément de plus à notre table: une contrainte de vérification qui garantit la SalesLastYear la valeur n&#39;est jamais inférieure à zéro. Le listing 2 montre le MODIFIER TABLE J&#39;ai utilisé pour ajouter la contrainte.","MODIFIER TABLE LastYearSales\nAJOUTER CONTRAINTE ckSalesTotal VÉRIFIER (SalesLastYear &gt; = 0);\nALLER","Listing 2: Ajout d&#39;une contrainte de vérification à la table LastYearSales \nLa contrainte facilite la génération d&#39;une erreur lors de la mise à jour de la table. Tout ce que je dois faire, c&#39;est essayer d&#39;ajouter un montant négatif au SalesLastYear , un montant suffisamment élevé pour que SQL Server génère une erreur. Une fois que nous avons créé notre table et ajouté la contrainte de vérification, nous avons l&#39;environnement dont nous avons besoin pour les exemples de cet article. Vous pouvez tout aussi facilement créer votre propre table et l&#39;utiliser dans les exemples. Assurez-vous simplement d&#39;avoir un moyen de violer une contrainte ou de trouver un autre mécanisme pour générer une erreur. Le but est de créer un script qui gère toutes les erreurs. \nUne fois que nous avons configuré notre table, l&#39;étape suivante consiste à créer une procédure stockée qui montre comment gérer les erreurs. La procédure, UpdateSales, modifie la valeur dans le SalesLastYear dans la colonne LastYearSales table pour un vendeur spécifié. Il fonctionne en ajoutant ou en soustrayant un montant de la valeur actuelle dans cette colonne. Le listing 3 montre le script que j&#39;ai utilisé pour créer la procédure. Notez que j&#39;inclus deux paramètres d&#39;entrée-@SalesPersonID et @SalesAmt-qui coïncident avec la table SalesPersonID et SalesLastYear Colonnes.","1\n2\n3\n4\n5\n6\n7\n8\n9\ndix\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36","UTILISATION AdventureWorks2012;\nALLER","SI OBJECT_ID(«UpdateSales», «P») EST NE PAS NUL\nLAISSEZ TOMBER PROCÉDURE UpdateSales;\nALLER","CRÉER PROCÉDURE UpdateSales\n  @SalesPersonID INT,\n  @SalesAmt ARGENT = 0\nCOMME\nCOMMENCER\n  COMMENCER ESSAYER\n    COMMENCER TRANSACTION;\n      MISE À JOUR LastYearSales\n      ENSEMBLE SalesLastYear = SalesLastYear + @SalesAmt\n      OÙ SalesPersonID = @SalesPersonID;\n    COMMETTRE TRANSACTION;\n  FIN ESSAYER\n  COMMENCER CAPTURE\n    SI @@TRANCOUNT &gt; 0\n    RETOUR EN ARRIERE TRANSACTION;","DÉCLARER @ErrorNumber INT = ERROR_NUMBER();\n    DÉCLARER @ErrorLine INT = ERROR_LINE();\n    DÉCLARER @Message d&#39;erreur NVARCHAR(4000) = MESSAGE D&#39;ERREUR();\n    DÉCLARER @ErrorSeverity INT = ERROR_SEVERITY();\n    DÉCLARER @ErrorState INT = ERROR_STATE();","IMPRESSION &#39;Numéro d&#39;erreur réel:&#39; + JETER(@ErrorNumber COMME VARCHAR(dix));\n    IMPRESSION &#39;Numéro de ligne réel:&#39; + JETER(@ErrorLine COMME VARCHAR(dix));","RAISERROR(@Message d&#39;erreur, @ErrorSeverity, @ErrorState);\n  FIN CAPTURE\nFIN;\nALLER","Listing 3: Création d&#39;une procédure stockée contenant un bloc Try… Catch \nLe corps principal de la définition de la procédure, inclus dans le COMMENCER… FIN bloc, contient le ESSAYEZ &#8230; bloc, lui-même divisé en ESSAYER bloc et CAPTURE bloquer. le ESSAYER le bloc commence par DÉBUT et se termine par ENDTRY et contient le T-SQL nécessaire pour exécuter les actions de la procédure. Dans ce cas, j&#39;inclus un MISE À JOUR déclaration qui ajoute le @Montant des ventes valeur à la SalesLastYear colonne. La déclaration est incluse dans DÉBUT DE TRANSACTION et COMMITTRANSACTION pour démarrer et valider explicitement la transaction. Les exemples varient en fonction de l&#39;endroit où ils incluent les déclarations relatives aux transactions. (Certains n&#39;incluent pas du tout les relevés.) Gardez simplement à l&#39;esprit que vous souhaitez valider ou annuler vos transactions aux moments appropriés, selon qu&#39;une erreur a été générée. \nSi la MISE À JOUR s&#39;exécute avec succès, le SalesLastYear est mise à jour et l&#39;opération est terminée, auquel cas le code dans le CAPTURE le bloc n&#39;est jamais exécuté. Cependant, si le MISE À JOUR échoue et SQL Server génère une erreur, la transaction est terminée et le moteur de base de données passe à la CAPTURE bloquer. le CAPTURE le bloc commence par BEGINCATCH et se termine par ENDCATCH et contient les instructions nécessaires pour gérer l&#39;erreur. \nPour la procédure stockée dans le Listing 3, la première étape que je prends dans le CAPTURE le bloc consiste à annuler la transaction si elle est toujours en cours d&#39;exécution. Je commence par utiliser le @@ TRANCOUNT pour déterminer si des transactions sont encore ouvertes. @@ TRANCOUNT est une fonction SQL Server intégrée qui renvoie le nombre de transactions en cours d&#39;exécution dans la session en cours. Dans ce cas, il ne devrait y en avoir qu&#39;un (si une erreur se produit), donc j&#39;annule cette transaction. \nEnsuite, je déclare un ensemble de variables basées sur les fonctions système que SQL Server met à disposition dans le cadre de la CAPTURE bloquer. Les fonctions renvoient des informations relatives aux erreurs que vous pouvez référencer dans vos instructions T-SQL. Actuellement, SQL Server prend en charge les fonctions suivantes à cette fin:","ERROR_NUMBER (): Le numéro attribué à l&#39;erreur.  \nERROR_LINE (): Numéro de ligne dans la routine qui a provoqué l&#39;erreur.  \nMESSAGE D&#39;ERREUR(): Le texte du message d&#39;erreur, qui inclut les valeurs fournies pour tous les paramètres substituables, tels que les heures ou les noms d&#39;objets.  \nERROR_SEVERITY (): La gravité de l&#39;erreur.  \nERROR_STATE (): Numéro d&#39;état de l&#39;erreur.  \nERROR_PROCEDURE (): Nom de la procédure stockée ou du déclencheur qui a généré l&#39;erreur.","Pour cet exemple, j&#39;utilise toutes les fonctions sauf la dernière, mais dans un environnement de production, vous pouvez également utiliser celle-ci. \nAprès avoir déclaré les variables, j&#39;inclus deux IMPRESSION des instructions qui affichent les valeurs de la @ErrorNumber et @ErrorLine variables (avec un texte explicatif). La raison pour laquelle je fais cela est de démontrer la différence entre ce que sont les valeurs réelles et ce que le RAISERROR comme vous le verrez sous peu. \nle RAISERROR déclaration vient après la IMPRESSION déclarations. L&#39;instruction renvoie des informations d&#39;erreur à l&#39;application appelante. Généralement, lors de l&#39;utilisation RAISERROR, vous devez inclure un message d&#39;erreur, un niveau de gravité d&#39;erreur et un état d&#39;erreur. Les règles qui régissent le RAISERROR les arguments et les valeurs qu&#39;ils renvoient sont un peu complexes et dépassent le cadre de cet article, mais pour les besoins de cet exemple, je passe simplement @Message d&#39;erreur, @ErrorSeverity, et @ErrorState variables comme arguments.","REMARQUE: Pour plus d&#39;informations sur l&#39;instruction RAISERROR, consultez la rubrique «RAISERROR (Transact-SQL)» dans la documentation en ligne de SQL Server.","C&#39;est tout ce que vous devez faire pour créer une procédure stockée contenant un ESSAYEZ &#8230; bloquer. Dans un instant, nous allons essayer notre travail. Mais d&#39;abord, récupérons une ligne de la LastYearSales tableau pour voir quelle est la valeur actuelle pour le vendeur 288. Le listing 4 montre le SÉLECTIONNER J&#39;ai utilisé pour récupérer les données.","SÉLECTIONNER Nom complet, SalesLastYear\nDE LastYearSales\nOÙ SalesPersonID = 288","Listing 4: Récupération de la date dans la table LastYearSales \nSans surprise, la déclaration renvoie le nom et les ventes totales de ce vendeur, comme indiqué dans le listing 5. Comme vous pouvez le voir, Rachel Valdez affiche plus de 1,3 million de dollars de ventes pour l&#39;année dernière.","Nom complet\t\tSalesLastYear\nRachel Valdez\t\t1307949.7917","Listing 5: Données extraites de la table LastYearSales \nEssayons maintenant le UpdateSales procédure stockée. Juste pour le plaisir, ajoutons quelques millions de dollars aux totaux de Rachel Valdez. Le listing 6 montre comment j&#39;utilise le EXEC déclaration pour appeler la procédure et transmettre l&#39;ID du vendeur et les 2 millions de dollars.","EXEC UpdateSales 288, 2000000;","Listing 6: Exécution de la procédure stockée UpdateSales \nLa procédure stockée doit s&#39;exécuter sans problème car nous ne violons pas la contrainte de vérification. Si nous devions exécuter la SÉLECTIONNER à nouveau (celle de l&#39;extrait 4), nos résultats ressembleraient à ceux de l&#39;extrait 7. Notez tout l&#39;argent supplémentaire.","Nom complet\t\tSalesLastYear\nRachel Valdez\t\t3307949.7917","Listing 7: Affichage du montant des ventes mis à jour dans le tableau LastYearSales \nVoyons maintenant ce qui se passe si nous soustrayons suffisamment de son compte pour ramener ses totaux en dessous de zéro. Dans la liste 8, je lance à nouveau la procédure, mais cette fois précisez -4000000 pour le montant.","EXEC UpdateSales 288, &#8211;4000000;","Listing 8: Causer la procédure stockée UpdateSales pour générer une erreur \nComme vous vous en souvenez, après avoir créé le LastYearSales table, j&#39;ai ajouté une contrainte de vérification pour s&#39;assurer que le montant ne pouvait pas tomber en dessous de zéro. Par conséquent, la procédure stockée génère maintenant une erreur, qui est indiquée dans le listing 9.","(0 rangée(s) affecté)\nRéel Erreur nombre: 547\nRéel ligne nombre: 9\nMsg 50000, Niveau 16, Etat 0, Procédure UpdateSales, Ligne 27\nle MISE À JOUR déclaration en conflit avec le VÉRIFIER contrainte &quot;ckSalesTotal&quot;. le conflit eu lieu dans base de données &quot;AdventureWorks2012&quot;, table &quot;dbo.LastYearSales&quot;, colonne «SalesLastYear».","Listing 9: Le message d&#39;erreur renvoyé par la procédure stockée UpdateSales \nComme prévu, les informations que nous avons incluses dans le CAPTURE bloc a été retourné. Mais notez que le numéro d&#39;erreur réel (547) est différent du RAISERROR numéro de message (50000) et que le numéro de ligne réel (9) est différent du RAISERROR numéro de ligne (27). En théorie, ces valeurs devraient coïncider. Mais comme je l&#39;ai mentionné plus tôt, les règles qui régissent RAISERROR sont un peu excentriques. \nPour simplifier le renvoi d&#39;erreurs dans un CAPTURE bloc, SQL Server 2012 a introduit le JETER déclaration. Avec le JETER , vous n&#39;avez pas besoin de spécifier de paramètres et les résultats sont plus précis. Vous incluez simplement la déclaration telle quelle dans le CAPTURE bloquer.","REMARQUE: Vous pouvez utiliser le JETER déclaration en dehors de la CAPTURE bloc, mais vous devez inclure des valeurs de paramètre pour ce faire. Pour plus d&#39;informations sur le JETER , consultez la rubrique «THROW (Transact-SQL)» dans la documentation en ligne de SQL Server.","Pour démontrer la JETER déclaration, j&#39;ai défini un ALTER PROCEDURE déclaration qui modifie la UpdateSales procédure, en particulier la CAPTURE bloc, comme indiqué dans l&#39;extrait 10.","1\n2\n3\n4\n5\n6\n7\n8\n9\ndix\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26","MODIFIER PROCÉDURE UpdateSales\n  @SalesPersonID INT,\n  @SalesAmt ARGENT = 0\nCOMME\nCOMMENCER\n  COMMENCER ESSAYER\n    COMMENCER TRANSACTION;\n      MISE À JOUR LastYearSales\n      ENSEMBLE SalesLastYear = SalesLastYear + @SalesAmt\n      OÙ SalesPersonID = @SalesPersonID;\n    COMMETTRE TRANSACTION;\n  FIN ESSAYER\n  COMMENCER CAPTURE\n    SI @@TRANCOUNT &gt; 0\n    RETOUR EN ARRIERE TRANSACTION;","DÉCLARER @ErrorNumber INT = ERROR_NUMBER();\n    DÉCLARER @ErrorLine INT = ERROR_LINE();","IMPRESSION &#39;Numéro d&#39;erreur réel:&#39; + JETER(@ErrorNumber COMME VARCHAR(dix));\n    IMPRESSION &#39;Numéro de ligne réel:&#39; + JETER(@ErrorLine COMME VARCHAR(dix));","JETER;\n  FIN CAPTURE\nFIN;\nALLER","Listing 10: Modification de la procédure stockée UpdateSales \nNotez que je conserve le @ErrorNumber et @ErrorLine déclarations de variables et leurs connexes IMPRESSION déclarations. Je le fais uniquement pour démontrer la JETER l&#39;exactitude de la déclaration. En fait, je dois seulement annuler la transaction et spécifier le JETER , sans aucun paramètre. \nMaintenant, exécutons à nouveau la procédure stockée, en essayant à nouveau de déduire 4 millions de dollars du montant des ventes, comme indiqué dans le listing 11.","EXEC UpdateSales 288, &#8211;4000000;","Listing 11: Causer la procédure stockée UpdateSales pour générer une erreur \nUne fois de plus, SQL Server renvoie une erreur. Seulement cette fois, les informations sont plus précises. Comme vous pouvez le voir dans l&#39;extrait 12, les numéros de message et les numéros de ligne correspondent désormais. Nous n&#39;avons plus besoin de déclarer des variables ou d&#39;appeler des fonctions système pour renvoyer des informations relatives aux erreurs à l&#39;application appelante.","(0 rangée(s) affecté)\nRéel Erreur nombre: 547\nRéel ligne nombre: 8\nMsg 547, Niveau 16, Etat 0, Procédure UpdateSales, Ligne 8\nle MISE À JOUR déclaration en conflit avec le VÉRIFIER contrainte &quot;ckSalesTotal&quot;. le conflit eu lieu dans base de données &quot;AdventureWorks2012&quot;, table &quot;dbo.LastYearSales&quot;, colonne «SalesLastYear».","Listing 12: Le message d&#39;erreur renvoyé par la procédure stockée UpdateSales \nComme vous pouvez le voir, SQL Server 2012 rend la gestion des erreurs plus facile que jamais. Même si vous utilisez le ESSAYEZ &#8230; bloquer pendant un certain temps, le JETER déclaration devrait prouver un grand avantage sur RAISERROR. Et si vous débutez dans la gestion des erreurs dans SQL Server, vous constaterez que le ESSAYEZ &#8230; bloc et JETER ensemble, le processus est assez indolore, il vaut bien le temps et les efforts nécessaires pour les apprendre et les mettre en œuvre.","Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]"],"content_blocks":[{"id":"text-1","type":"text","heading":"","plain_text":"Depuis la sortie de SQL Server 2005, vous pouvez gérer les erreurs dans votre code T-SQL en incluant un ESSAYEZ &#8230; bloc qui contrôle le flux de votre script en cas d&#39;erreur, semblable à la façon dont les langages procéduraux ont traditionnellement traité les erreurs. le ESSAYEZ &#8230; Le bloc facilite le retour ou l&#39;audit des données liées aux erreurs, ainsi que la prise d&#39;autres mesures. Et dans le bloc en particulier, le CAPTURE portion-vous avez pu inclure un RAISERROR afin de renvoyer les données relatives aux erreurs à l&#39;application appelante. Cependant, avec la version de SQL Server 2012, vous disposez désormais d&#39;un remplacement pour RAISERROR, le JETER , ce qui facilite plus que jamais la capture des données d&#39;erreur. \nDans cet article, nous allons voir le ESSAYEZ &#8230; bloc utilisé avec le RAISERROR et JETER déclarations. Les exemples sont basés sur un tableau que j&#39;ai créé dans le AdventureWorks2012 exemple de base de données, sur une instance locale de SQL Server 2012. Le listing 1 montre le script T-SQL que j&#39;ai utilisé pour créer le LastYearSales table.","html":"<p>Depuis la sortie de SQL Server 2005, vous pouvez gérer les erreurs dans votre code T-SQL en incluant un ESSAYEZ &#8230; bloc qui contrôle le flux de votre script en cas d&#039;erreur, semblable à la façon dont les langages procéduraux ont traditionnellement traité les erreurs. le ESSAYEZ &#8230; Le bloc facilite le retour ou l&#039;audit des données liées aux erreurs, ainsi que la prise d&#039;autres mesures. Et dans le bloc en particulier, le CAPTURE portion-vous avez pu inclure un RAISERROR afin de renvoyer les données relatives aux erreurs à l&#039;application appelante. Cependant, avec la version de SQL Server 2012, vous disposez désormais d&#039;un remplacement pour RAISERROR, le JETER , ce qui facilite plus que jamais la capture des données d&#039;erreur. \nDans cet article, nous allons voir le ESSAYEZ &#8230; bloc utilisé avec le RAISERROR et JETER déclarations. Les exemples sont basés sur un tableau que j&#039;ai créé dans le AdventureWorks2012 exemple de base de données, sur une instance locale de SQL Server 2012. Le listing 1 montre le script T-SQL que j&#039;ai utilisé pour créer le LastYearSales table.</p>"},{"id":"text-2","type":"text","heading":"","plain_text":"1\n2\n3\n4\n5\n6\n7\n8\n9\ndix\n11\n12\n13\n14\n15\n16\n17\n18","html":"<p>1\n2\n3\n4\n5\n6\n7\n8\n9\ndix\n11\n12\n13\n14\n15\n16\n17\n18</p>"},{"id":"text-3","type":"text","heading":"","plain_text":"UTILISATION AdventureWorks2012;\nALLER","html":"<p>UTILISATION AdventureWorks2012;\nALLER</p>"},{"id":"text-4","type":"text","heading":"","plain_text":"SI OBJECT_ID(«LastYearSales», «U») EST NE PAS NUL\nLAISSEZ TOMBER TABLE LastYearSales;\nALLER","html":"<p>SI OBJECT_ID(«LastYearSales», «U») EST NE PAS NUL\nLAISSEZ TOMBER TABLE LastYearSales;\nALLER</p>"},{"id":"text-5","type":"text","heading":"","plain_text":"SÉLECTIONNER\n  BusinessEntityID COMME SalesPersonID,\n  Prénom + &#39;&#39; + Nom de famille COMME Nom complet,\n  SalesLastYear\nDANS\n  LastYearSales\nDE\n  Ventes.vSalesPerson\nOÙ\n  SalesLastYear &gt; 0;\nALLER","html":"<p>SÉLECTIONNER\n  BusinessEntityID COMME SalesPersonID,\n  Prénom + &#039;&#039; + Nom de famille COMME Nom complet,\n  SalesLastYear\nDANS\n  LastYearSales\nDE\n  Ventes.vSalesPerson\nOÙ\n  SalesLastYear &gt; 0;\nALLER</p>"},{"id":"text-6","type":"text","heading":"","plain_text":"Listing 1: Création de la table LastYearSales \nLe script devrait être assez simple. J&#39;utilise un CHOISIR… DANS pour récupérer les données de la Sales.vSalesPerson la visualiser et l&#39;insérer dans la table nouvellement créée. Cependant, pour montrer comment gérer les erreurs, nous devons ajouter un élément de plus à notre table: une contrainte de vérification qui garantit la SalesLastYear la valeur n&#39;est jamais inférieure à zéro. Le listing 2 montre le MODIFIER TABLE J&#39;ai utilisé pour ajouter la contrainte.","html":"<p>Listing 1: Création de la table LastYearSales \nLe script devrait être assez simple. J&#039;utilise un CHOISIR… DANS pour récupérer les données de la Sales.vSalesPerson la visualiser et l&#039;insérer dans la table nouvellement créée. Cependant, pour montrer comment gérer les erreurs, nous devons ajouter un élément de plus à notre table: une contrainte de vérification qui garantit la SalesLastYear la valeur n&#039;est jamais inférieure à zéro. Le listing 2 montre le MODIFIER TABLE J&#039;ai utilisé pour ajouter la contrainte.</p>"},{"id":"text-7","type":"text","heading":"","plain_text":"MODIFIER TABLE LastYearSales\nAJOUTER CONTRAINTE ckSalesTotal VÉRIFIER (SalesLastYear &gt; = 0);\nALLER","html":"<p>MODIFIER TABLE LastYearSales\nAJOUTER CONTRAINTE ckSalesTotal VÉRIFIER (SalesLastYear &gt; = 0);\nALLER</p>"},{"id":"text-8","type":"text","heading":"","plain_text":"Listing 2: Ajout d&#39;une contrainte de vérification à la table LastYearSales \nLa contrainte facilite la génération d&#39;une erreur lors de la mise à jour de la table. Tout ce que je dois faire, c&#39;est essayer d&#39;ajouter un montant négatif au SalesLastYear , un montant suffisamment élevé pour que SQL Server génère une erreur. Une fois que nous avons créé notre table et ajouté la contrainte de vérification, nous avons l&#39;environnement dont nous avons besoin pour les exemples de cet article. Vous pouvez tout aussi facilement créer votre propre table et l&#39;utiliser dans les exemples. Assurez-vous simplement d&#39;avoir un moyen de violer une contrainte ou de trouver un autre mécanisme pour générer une erreur. Le but est de créer un script qui gère toutes les erreurs. \nUne fois que nous avons configuré notre table, l&#39;étape suivante consiste à créer une procédure stockée qui montre comment gérer les erreurs. La procédure, UpdateSales, modifie la valeur dans le SalesLastYear dans la colonne LastYearSales table pour un vendeur spécifié. Il fonctionne en ajoutant ou en soustrayant un montant de la valeur actuelle dans cette colonne. Le listing 3 montre le script que j&#39;ai utilisé pour créer la procédure. Notez que j&#39;inclus deux paramètres d&#39;entrée-@SalesPersonID et @SalesAmt-qui coïncident avec la table SalesPersonID et SalesLastYear Colonnes.","html":"<p>Listing 2: Ajout d&#039;une contrainte de vérification à la table LastYearSales \nLa contrainte facilite la génération d&#039;une erreur lors de la mise à jour de la table. Tout ce que je dois faire, c&#039;est essayer d&#039;ajouter un montant négatif au SalesLastYear , un montant suffisamment élevé pour que SQL Server génère une erreur. Une fois que nous avons créé notre table et ajouté la contrainte de vérification, nous avons l&#039;environnement dont nous avons besoin pour les exemples de cet article. Vous pouvez tout aussi facilement créer votre propre table et l&#039;utiliser dans les exemples. Assurez-vous simplement d&#039;avoir un moyen de violer une contrainte ou de trouver un autre mécanisme pour générer une erreur. Le but est de créer un script qui gère toutes les erreurs. \nUne fois que nous avons configuré notre table, l&#039;étape suivante consiste à créer une procédure stockée qui montre comment gérer les erreurs. La procédure, UpdateSales, modifie la valeur dans le SalesLastYear dans la colonne LastYearSales table pour un vendeur spécifié. Il fonctionne en ajoutant ou en soustrayant un montant de la valeur actuelle dans cette colonne. Le listing 3 montre le script que j&#039;ai utilisé pour créer la procédure. Notez que j&#039;inclus deux paramètres d&#039;entrée-@SalesPersonID et @SalesAmt-qui coïncident avec la table SalesPersonID et SalesLastYear Colonnes.</p>"},{"id":"text-9","type":"text","heading":"","plain_text":"1\n2\n3\n4\n5\n6\n7\n8\n9\ndix\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36","html":"<p>1\n2\n3\n4\n5\n6\n7\n8\n9\ndix\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36</p>"},{"id":"text-10","type":"text","heading":"","plain_text":"UTILISATION AdventureWorks2012;\nALLER","html":"<p>UTILISATION AdventureWorks2012;\nALLER</p>"},{"id":"text-11","type":"text","heading":"","plain_text":"SI OBJECT_ID(«UpdateSales», «P») EST NE PAS NUL\nLAISSEZ TOMBER PROCÉDURE UpdateSales;\nALLER","html":"<p>SI OBJECT_ID(«UpdateSales», «P») EST NE PAS NUL\nLAISSEZ TOMBER PROCÉDURE UpdateSales;\nALLER</p>"},{"id":"text-12","type":"text","heading":"","plain_text":"CRÉER PROCÉDURE UpdateSales\n  @SalesPersonID INT,\n  @SalesAmt ARGENT = 0\nCOMME\nCOMMENCER\n  COMMENCER ESSAYER\n    COMMENCER TRANSACTION;\n      MISE À JOUR LastYearSales\n      ENSEMBLE SalesLastYear = SalesLastYear + @SalesAmt\n      OÙ SalesPersonID = @SalesPersonID;\n    COMMETTRE TRANSACTION;\n  FIN ESSAYER\n  COMMENCER CAPTURE\n    SI @@TRANCOUNT &gt; 0\n    RETOUR EN ARRIERE TRANSACTION;","html":"<p>CRÉER PROCÉDURE UpdateSales\n  @SalesPersonID INT,\n  @SalesAmt ARGENT = 0\nCOMME\nCOMMENCER\n  COMMENCER ESSAYER\n    COMMENCER TRANSACTION;\n      MISE À JOUR LastYearSales\n      ENSEMBLE SalesLastYear = SalesLastYear + @SalesAmt\n      OÙ SalesPersonID = @SalesPersonID;\n    COMMETTRE TRANSACTION;\n  FIN ESSAYER\n  COMMENCER CAPTURE\n    SI @@TRANCOUNT &gt; 0\n    RETOUR EN ARRIERE TRANSACTION;</p>"},{"id":"text-13","type":"text","heading":"","plain_text":"DÉCLARER @ErrorNumber INT = ERROR_NUMBER();\n    DÉCLARER @ErrorLine INT = ERROR_LINE();\n    DÉCLARER @Message d&#39;erreur NVARCHAR(4000) = MESSAGE D&#39;ERREUR();\n    DÉCLARER @ErrorSeverity INT = ERROR_SEVERITY();\n    DÉCLARER @ErrorState INT = ERROR_STATE();","html":"<p>DÉCLARER @ErrorNumber INT = ERROR_NUMBER();\n    DÉCLARER @ErrorLine INT = ERROR_LINE();\n    DÉCLARER @Message d&#039;erreur NVARCHAR(4000) = MESSAGE D&#039;ERREUR();\n    DÉCLARER @ErrorSeverity INT = ERROR_SEVERITY();\n    DÉCLARER @ErrorState INT = ERROR_STATE();</p>"},{"id":"text-14","type":"text","heading":"","plain_text":"IMPRESSION &#39;Numéro d&#39;erreur réel:&#39; + JETER(@ErrorNumber COMME VARCHAR(dix));\n    IMPRESSION &#39;Numéro de ligne réel:&#39; + JETER(@ErrorLine COMME VARCHAR(dix));","html":"<p>IMPRESSION &#039;Numéro d&#039;erreur réel:&#039; + JETER(@ErrorNumber COMME VARCHAR(dix));\n    IMPRESSION &#039;Numéro de ligne réel:&#039; + JETER(@ErrorLine COMME VARCHAR(dix));</p>"},{"id":"text-15","type":"text","heading":"","plain_text":"RAISERROR(@Message d&#39;erreur, @ErrorSeverity, @ErrorState);\n  FIN CAPTURE\nFIN;\nALLER","html":"<p>RAISERROR(@Message d&#039;erreur, @ErrorSeverity, @ErrorState);\n  FIN CAPTURE\nFIN;\nALLER</p>"},{"id":"text-16","type":"text","heading":"","plain_text":"Listing 3: Création d&#39;une procédure stockée contenant un bloc Try… Catch \nLe corps principal de la définition de la procédure, inclus dans le COMMENCER… FIN bloc, contient le ESSAYEZ &#8230; bloc, lui-même divisé en ESSAYER bloc et CAPTURE bloquer. le ESSAYER le bloc commence par DÉBUT et se termine par ENDTRY et contient le T-SQL nécessaire pour exécuter les actions de la procédure. Dans ce cas, j&#39;inclus un MISE À JOUR déclaration qui ajoute le @Montant des ventes valeur à la SalesLastYear colonne. La déclaration est incluse dans DÉBUT DE TRANSACTION et COMMITTRANSACTION pour démarrer et valider explicitement la transaction. Les exemples varient en fonction de l&#39;endroit où ils incluent les déclarations relatives aux transactions. (Certains n&#39;incluent pas du tout les relevés.) Gardez simplement à l&#39;esprit que vous souhaitez valider ou annuler vos transactions aux moments appropriés, selon qu&#39;une erreur a été générée. \nSi la MISE À JOUR s&#39;exécute avec succès, le SalesLastYear est mise à jour et l&#39;opération est terminée, auquel cas le code dans le CAPTURE le bloc n&#39;est jamais exécuté. Cependant, si le MISE À JOUR échoue et SQL Server génère une erreur, la transaction est terminée et le moteur de base de données passe à la CAPTURE bloquer. le CAPTURE le bloc commence par BEGINCATCH et se termine par ENDCATCH et contient les instructions nécessaires pour gérer l&#39;erreur. \nPour la procédure stockée dans le Listing 3, la première étape que je prends dans le CAPTURE le bloc consiste à annuler la transaction si elle est toujours en cours d&#39;exécution. Je commence par utiliser le @@ TRANCOUNT pour déterminer si des transactions sont encore ouvertes. @@ TRANCOUNT est une fonction SQL Server intégrée qui renvoie le nombre de transactions en cours d&#39;exécution dans la session en cours. Dans ce cas, il ne devrait y en avoir qu&#39;un (si une erreur se produit), donc j&#39;annule cette transaction. \nEnsuite, je déclare un ensemble de variables basées sur les fonctions système que SQL Server met à disposition dans le cadre de la CAPTURE bloquer. Les fonctions renvoient des informations relatives aux erreurs que vous pouvez référencer dans vos instructions T-SQL. Actuellement, SQL Server prend en charge les fonctions suivantes à cette fin:","html":"<p>Listing 3: Création d&#039;une procédure stockée contenant un bloc Try… Catch \nLe corps principal de la définition de la procédure, inclus dans le COMMENCER… FIN bloc, contient le ESSAYEZ &#8230; bloc, lui-même divisé en ESSAYER bloc et CAPTURE bloquer. le ESSAYER le bloc commence par DÉBUT et se termine par ENDTRY et contient le T-SQL nécessaire pour exécuter les actions de la procédure. Dans ce cas, j&#039;inclus un MISE À JOUR déclaration qui ajoute le @Montant des ventes valeur à la SalesLastYear colonne. La déclaration est incluse dans DÉBUT DE TRANSACTION et COMMITTRANSACTION pour démarrer et valider explicitement la transaction. Les exemples varient en fonction de l&#039;endroit où ils incluent les déclarations relatives aux transactions. (Certains n&#039;incluent pas du tout les relevés.) Gardez simplement à l&#039;esprit que vous souhaitez valider ou annuler vos transactions aux moments appropriés, selon qu&#039;une erreur a été générée. \nSi la MISE À JOUR s&#039;exécute avec succès, le SalesLastYear est mise à jour et l&#039;opération est terminée, auquel cas le code dans le CAPTURE le bloc n&#039;est jamais exécuté. Cependant, si le MISE À JOUR échoue et SQL Server génère une erreur, la transaction est terminée et le moteur de base de données passe à la CAPTURE bloquer. le CAPTURE le bloc commence par BEGINCATCH et se termine par ENDCATCH et contient les instructions nécessaires pour gérer l&#039;erreur. \nPour la procédure stockée dans le Listing 3, la première étape que je prends dans le CAPTURE le bloc consiste à annuler la transaction si elle est toujours en cours d&#039;exécution. Je commence par utiliser le @@ TRANCOUNT pour déterminer si des transactions sont encore ouvertes. @@ TRANCOUNT est une fonction SQL Server intégrée qui renvoie le nombre de transactions en cours d&#039;exécution dans la session en cours. Dans ce cas, il ne devrait y en avoir qu&#039;un (si une erreur se produit), donc j&#039;annule cette transaction. \nEnsuite, je déclare un ensemble de variables basées sur les fonctions système que SQL Server met à disposition dans le cadre de la CAPTURE bloquer. Les fonctions renvoient des informations relatives aux erreurs que vous pouvez référencer dans vos instructions T-SQL. Actuellement, SQL Server prend en charge les fonctions suivantes à cette fin:</p>"},{"id":"text-17","type":"text","heading":"","plain_text":"ERROR_NUMBER (): Le numéro attribué à l&#39;erreur.  \nERROR_LINE (): Numéro de ligne dans la routine qui a provoqué l&#39;erreur.  \nMESSAGE D&#39;ERREUR(): Le texte du message d&#39;erreur, qui inclut les valeurs fournies pour tous les paramètres substituables, tels que les heures ou les noms d&#39;objets.  \nERROR_SEVERITY (): La gravité de l&#39;erreur.  \nERROR_STATE (): Numéro d&#39;état de l&#39;erreur.  \nERROR_PROCEDURE (): Nom de la procédure stockée ou du déclencheur qui a généré l&#39;erreur.","html":"<p>ERROR_NUMBER (): Le numéro attribué à l&#039;erreur.  \nERROR_LINE (): Numéro de ligne dans la routine qui a provoqué l&#039;erreur.  \nMESSAGE D&#039;ERREUR(): Le texte du message d&#039;erreur, qui inclut les valeurs fournies pour tous les paramètres substituables, tels que les heures ou les noms d&#039;objets.  \nERROR_SEVERITY (): La gravité de l&#039;erreur.  \nERROR_STATE (): Numéro d&#039;état de l&#039;erreur.  \nERROR_PROCEDURE (): Nom de la procédure stockée ou du déclencheur qui a généré l&#039;erreur.</p>"},{"id":"text-18","type":"text","heading":"","plain_text":"Pour cet exemple, j&#39;utilise toutes les fonctions sauf la dernière, mais dans un environnement de production, vous pouvez également utiliser celle-ci. \nAprès avoir déclaré les variables, j&#39;inclus deux IMPRESSION des instructions qui affichent les valeurs de la @ErrorNumber et @ErrorLine variables (avec un texte explicatif). La raison pour laquelle je fais cela est de démontrer la différence entre ce que sont les valeurs réelles et ce que le RAISERROR comme vous le verrez sous peu. \nle RAISERROR déclaration vient après la IMPRESSION déclarations. L&#39;instruction renvoie des informations d&#39;erreur à l&#39;application appelante. Généralement, lors de l&#39;utilisation RAISERROR, vous devez inclure un message d&#39;erreur, un niveau de gravité d&#39;erreur et un état d&#39;erreur. Les règles qui régissent le RAISERROR les arguments et les valeurs qu&#39;ils renvoient sont un peu complexes et dépassent le cadre de cet article, mais pour les besoins de cet exemple, je passe simplement @Message d&#39;erreur, @ErrorSeverity, et @ErrorState variables comme arguments.","html":"<p>Pour cet exemple, j&#039;utilise toutes les fonctions sauf la dernière, mais dans un environnement de production, vous pouvez également utiliser celle-ci. \nAprès avoir déclaré les variables, j&#039;inclus deux IMPRESSION des instructions qui affichent les valeurs de la @ErrorNumber et @ErrorLine variables (avec un texte explicatif). La raison pour laquelle je fais cela est de démontrer la différence entre ce que sont les valeurs réelles et ce que le RAISERROR comme vous le verrez sous peu. \nle RAISERROR déclaration vient après la IMPRESSION déclarations. L&#039;instruction renvoie des informations d&#039;erreur à l&#039;application appelante. Généralement, lors de l&#039;utilisation RAISERROR, vous devez inclure un message d&#039;erreur, un niveau de gravité d&#039;erreur et un état d&#039;erreur. Les règles qui régissent le RAISERROR les arguments et les valeurs qu&#039;ils renvoient sont un peu complexes et dépassent le cadre de cet article, mais pour les besoins de cet exemple, je passe simplement @Message d&#039;erreur, @ErrorSeverity, et @ErrorState variables comme arguments.</p>"},{"id":"text-19","type":"text","heading":"","plain_text":"REMARQUE: Pour plus d&#39;informations sur l&#39;instruction RAISERROR, consultez la rubrique «RAISERROR (Transact-SQL)» dans la documentation en ligne de SQL Server.","html":"<p>REMARQUE: Pour plus d&#039;informations sur l&#039;instruction RAISERROR, consultez la rubrique «RAISERROR (Transact-SQL)» dans la documentation en ligne de SQL Server.</p>"},{"id":"text-20","type":"text","heading":"","plain_text":"C&#39;est tout ce que vous devez faire pour créer une procédure stockée contenant un ESSAYEZ &#8230; bloquer. Dans un instant, nous allons essayer notre travail. Mais d&#39;abord, récupérons une ligne de la LastYearSales tableau pour voir quelle est la valeur actuelle pour le vendeur 288. Le listing 4 montre le SÉLECTIONNER J&#39;ai utilisé pour récupérer les données.","html":"<p>C&#039;est tout ce que vous devez faire pour créer une procédure stockée contenant un ESSAYEZ &#8230; bloquer. Dans un instant, nous allons essayer notre travail. Mais d&#039;abord, récupérons une ligne de la LastYearSales tableau pour voir quelle est la valeur actuelle pour le vendeur 288. Le listing 4 montre le SÉLECTIONNER J&#039;ai utilisé pour récupérer les données.</p>"},{"id":"text-21","type":"text","heading":"","plain_text":"SÉLECTIONNER Nom complet, SalesLastYear\nDE LastYearSales\nOÙ SalesPersonID = 288","html":"<p>SÉLECTIONNER Nom complet, SalesLastYear\nDE LastYearSales\nOÙ SalesPersonID = 288</p>"},{"id":"text-22","type":"text","heading":"","plain_text":"Listing 4: Récupération de la date dans la table LastYearSales \nSans surprise, la déclaration renvoie le nom et les ventes totales de ce vendeur, comme indiqué dans le listing 5. Comme vous pouvez le voir, Rachel Valdez affiche plus de 1,3 million de dollars de ventes pour l&#39;année dernière.","html":"<p>Listing 4: Récupération de la date dans la table LastYearSales \nSans surprise, la déclaration renvoie le nom et les ventes totales de ce vendeur, comme indiqué dans le listing 5. Comme vous pouvez le voir, Rachel Valdez affiche plus de 1,3 million de dollars de ventes pour l&#039;année dernière.</p>"},{"id":"text-23","type":"text","heading":"","plain_text":"Nom complet\t\tSalesLastYear\nRachel Valdez\t\t1307949.7917","html":"<p>Nom complet\t\tSalesLastYear\nRachel Valdez\t\t1307949.7917</p>"},{"id":"text-24","type":"text","heading":"","plain_text":"Listing 5: Données extraites de la table LastYearSales \nEssayons maintenant le UpdateSales procédure stockée. Juste pour le plaisir, ajoutons quelques millions de dollars aux totaux de Rachel Valdez. Le listing 6 montre comment j&#39;utilise le EXEC déclaration pour appeler la procédure et transmettre l&#39;ID du vendeur et les 2 millions de dollars.","html":"<p>Listing 5: Données extraites de la table LastYearSales \nEssayons maintenant le UpdateSales procédure stockée. Juste pour le plaisir, ajoutons quelques millions de dollars aux totaux de Rachel Valdez. Le listing 6 montre comment j&#039;utilise le EXEC déclaration pour appeler la procédure et transmettre l&#039;ID du vendeur et les 2 millions de dollars.</p>"},{"id":"text-25","type":"text","heading":"","plain_text":"EXEC UpdateSales 288, 2000000;","html":"<p>EXEC UpdateSales 288, 2000000;</p>"},{"id":"text-26","type":"text","heading":"","plain_text":"Listing 6: Exécution de la procédure stockée UpdateSales \nLa procédure stockée doit s&#39;exécuter sans problème car nous ne violons pas la contrainte de vérification. Si nous devions exécuter la SÉLECTIONNER à nouveau (celle de l&#39;extrait 4), nos résultats ressembleraient à ceux de l&#39;extrait 7. Notez tout l&#39;argent supplémentaire.","html":"<p>Listing 6: Exécution de la procédure stockée UpdateSales \nLa procédure stockée doit s&#039;exécuter sans problème car nous ne violons pas la contrainte de vérification. Si nous devions exécuter la SÉLECTIONNER à nouveau (celle de l&#039;extrait 4), nos résultats ressembleraient à ceux de l&#039;extrait 7. Notez tout l&#039;argent supplémentaire.</p>"},{"id":"text-27","type":"text","heading":"","plain_text":"Nom complet\t\tSalesLastYear\nRachel Valdez\t\t3307949.7917","html":"<p>Nom complet\t\tSalesLastYear\nRachel Valdez\t\t3307949.7917</p>"},{"id":"text-28","type":"text","heading":"","plain_text":"Listing 7: Affichage du montant des ventes mis à jour dans le tableau LastYearSales \nVoyons maintenant ce qui se passe si nous soustrayons suffisamment de son compte pour ramener ses totaux en dessous de zéro. Dans la liste 8, je lance à nouveau la procédure, mais cette fois précisez -4000000 pour le montant.","html":"<p>Listing 7: Affichage du montant des ventes mis à jour dans le tableau LastYearSales \nVoyons maintenant ce qui se passe si nous soustrayons suffisamment de son compte pour ramener ses totaux en dessous de zéro. Dans la liste 8, je lance à nouveau la procédure, mais cette fois précisez -4000000 pour le montant.</p>"},{"id":"text-29","type":"text","heading":"","plain_text":"EXEC UpdateSales 288, &#8211;4000000;","html":"<p>EXEC UpdateSales 288, &#8211;4000000;</p>"},{"id":"text-30","type":"text","heading":"","plain_text":"Listing 8: Causer la procédure stockée UpdateSales pour générer une erreur \nComme vous vous en souvenez, après avoir créé le LastYearSales table, j&#39;ai ajouté une contrainte de vérification pour s&#39;assurer que le montant ne pouvait pas tomber en dessous de zéro. Par conséquent, la procédure stockée génère maintenant une erreur, qui est indiquée dans le listing 9.","html":"<p>Listing 8: Causer la procédure stockée UpdateSales pour générer une erreur \nComme vous vous en souvenez, après avoir créé le LastYearSales table, j&#039;ai ajouté une contrainte de vérification pour s&#039;assurer que le montant ne pouvait pas tomber en dessous de zéro. Par conséquent, la procédure stockée génère maintenant une erreur, qui est indiquée dans le listing 9.</p>"},{"id":"text-31","type":"text","heading":"","plain_text":"(0 rangée(s) affecté)\nRéel Erreur nombre: 547\nRéel ligne nombre: 9\nMsg 50000, Niveau 16, Etat 0, Procédure UpdateSales, Ligne 27\nle MISE À JOUR déclaration en conflit avec le VÉRIFIER contrainte &quot;ckSalesTotal&quot;. le conflit eu lieu dans base de données &quot;AdventureWorks2012&quot;, table &quot;dbo.LastYearSales&quot;, colonne «SalesLastYear».","html":"<p>(0 rangée(s) affecté)\nRéel Erreur nombre: 547\nRéel ligne nombre: 9\nMsg 50000, Niveau 16, Etat 0, Procédure UpdateSales, Ligne 27\nle MISE À JOUR déclaration en conflit avec le VÉRIFIER contrainte &quot;ckSalesTotal&quot;. le conflit eu lieu dans base de données &quot;AdventureWorks2012&quot;, table &quot;dbo.LastYearSales&quot;, colonne «SalesLastYear».</p>"},{"id":"text-32","type":"text","heading":"","plain_text":"Listing 9: Le message d&#39;erreur renvoyé par la procédure stockée UpdateSales \nComme prévu, les informations que nous avons incluses dans le CAPTURE bloc a été retourné. Mais notez que le numéro d&#39;erreur réel (547) est différent du RAISERROR numéro de message (50000) et que le numéro de ligne réel (9) est différent du RAISERROR numéro de ligne (27). En théorie, ces valeurs devraient coïncider. Mais comme je l&#39;ai mentionné plus tôt, les règles qui régissent RAISERROR sont un peu excentriques. \nPour simplifier le renvoi d&#39;erreurs dans un CAPTURE bloc, SQL Server 2012 a introduit le JETER déclaration. Avec le JETER , vous n&#39;avez pas besoin de spécifier de paramètres et les résultats sont plus précis. Vous incluez simplement la déclaration telle quelle dans le CAPTURE bloquer.","html":"<p>Listing 9: Le message d&#039;erreur renvoyé par la procédure stockée UpdateSales \nComme prévu, les informations que nous avons incluses dans le CAPTURE bloc a été retourné. Mais notez que le numéro d&#039;erreur réel (547) est différent du RAISERROR numéro de message (50000) et que le numéro de ligne réel (9) est différent du RAISERROR numéro de ligne (27). En théorie, ces valeurs devraient coïncider. Mais comme je l&#039;ai mentionné plus tôt, les règles qui régissent RAISERROR sont un peu excentriques. \nPour simplifier le renvoi d&#039;erreurs dans un CAPTURE bloc, SQL Server 2012 a introduit le JETER déclaration. Avec le JETER , vous n&#039;avez pas besoin de spécifier de paramètres et les résultats sont plus précis. Vous incluez simplement la déclaration telle quelle dans le CAPTURE bloquer.</p>"},{"id":"text-33","type":"text","heading":"","plain_text":"REMARQUE: Vous pouvez utiliser le JETER déclaration en dehors de la CAPTURE bloc, mais vous devez inclure des valeurs de paramètre pour ce faire. Pour plus d&#39;informations sur le JETER , consultez la rubrique «THROW (Transact-SQL)» dans la documentation en ligne de SQL Server.","html":"<p>REMARQUE: Vous pouvez utiliser le JETER déclaration en dehors de la CAPTURE bloc, mais vous devez inclure des valeurs de paramètre pour ce faire. Pour plus d&#039;informations sur le JETER , consultez la rubrique «THROW (Transact-SQL)» dans la documentation en ligne de SQL Server.</p>"},{"id":"text-34","type":"text","heading":"","plain_text":"Pour démontrer la JETER déclaration, j&#39;ai défini un ALTER PROCEDURE déclaration qui modifie la UpdateSales procédure, en particulier la CAPTURE bloc, comme indiqué dans l&#39;extrait 10.","html":"<p>Pour démontrer la JETER déclaration, j&#039;ai défini un ALTER PROCEDURE déclaration qui modifie la UpdateSales procédure, en particulier la CAPTURE bloc, comme indiqué dans l&#039;extrait 10.</p>"},{"id":"text-35","type":"text","heading":"","plain_text":"1\n2\n3\n4\n5\n6\n7\n8\n9\ndix\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26","html":"<p>1\n2\n3\n4\n5\n6\n7\n8\n9\ndix\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26</p>"},{"id":"text-36","type":"text","heading":"","plain_text":"MODIFIER PROCÉDURE UpdateSales\n  @SalesPersonID INT,\n  @SalesAmt ARGENT = 0\nCOMME\nCOMMENCER\n  COMMENCER ESSAYER\n    COMMENCER TRANSACTION;\n      MISE À JOUR LastYearSales\n      ENSEMBLE SalesLastYear = SalesLastYear + @SalesAmt\n      OÙ SalesPersonID = @SalesPersonID;\n    COMMETTRE TRANSACTION;\n  FIN ESSAYER\n  COMMENCER CAPTURE\n    SI @@TRANCOUNT &gt; 0\n    RETOUR EN ARRIERE TRANSACTION;","html":"<p>MODIFIER PROCÉDURE UpdateSales\n  @SalesPersonID INT,\n  @SalesAmt ARGENT = 0\nCOMME\nCOMMENCER\n  COMMENCER ESSAYER\n    COMMENCER TRANSACTION;\n      MISE À JOUR LastYearSales\n      ENSEMBLE SalesLastYear = SalesLastYear + @SalesAmt\n      OÙ SalesPersonID = @SalesPersonID;\n    COMMETTRE TRANSACTION;\n  FIN ESSAYER\n  COMMENCER CAPTURE\n    SI @@TRANCOUNT &gt; 0\n    RETOUR EN ARRIERE TRANSACTION;</p>"},{"id":"text-37","type":"text","heading":"","plain_text":"DÉCLARER @ErrorNumber INT = ERROR_NUMBER();\n    DÉCLARER @ErrorLine INT = ERROR_LINE();","html":"<p>DÉCLARER @ErrorNumber INT = ERROR_NUMBER();\n    DÉCLARER @ErrorLine INT = ERROR_LINE();</p>"},{"id":"text-38","type":"text","heading":"","plain_text":"IMPRESSION &#39;Numéro d&#39;erreur réel:&#39; + JETER(@ErrorNumber COMME VARCHAR(dix));\n    IMPRESSION &#39;Numéro de ligne réel:&#39; + JETER(@ErrorLine COMME VARCHAR(dix));","html":"<p>IMPRESSION &#039;Numéro d&#039;erreur réel:&#039; + JETER(@ErrorNumber COMME VARCHAR(dix));\n    IMPRESSION &#039;Numéro de ligne réel:&#039; + JETER(@ErrorLine COMME VARCHAR(dix));</p>"},{"id":"text-39","type":"text","heading":"","plain_text":"JETER;\n  FIN CAPTURE\nFIN;\nALLER","html":"<p>JETER;\n  FIN CAPTURE\nFIN;\nALLER</p>"},{"id":"text-40","type":"text","heading":"","plain_text":"Listing 10: Modification de la procédure stockée UpdateSales \nNotez que je conserve le @ErrorNumber et @ErrorLine déclarations de variables et leurs connexes IMPRESSION déclarations. Je le fais uniquement pour démontrer la JETER l&#39;exactitude de la déclaration. En fait, je dois seulement annuler la transaction et spécifier le JETER , sans aucun paramètre. \nMaintenant, exécutons à nouveau la procédure stockée, en essayant à nouveau de déduire 4 millions de dollars du montant des ventes, comme indiqué dans le listing 11.","html":"<p>Listing 10: Modification de la procédure stockée UpdateSales \nNotez que je conserve le @ErrorNumber et @ErrorLine déclarations de variables et leurs connexes IMPRESSION déclarations. Je le fais uniquement pour démontrer la JETER l&#039;exactitude de la déclaration. En fait, je dois seulement annuler la transaction et spécifier le JETER , sans aucun paramètre. \nMaintenant, exécutons à nouveau la procédure stockée, en essayant à nouveau de déduire 4 millions de dollars du montant des ventes, comme indiqué dans le listing 11.</p>"},{"id":"text-41","type":"text","heading":"","plain_text":"EXEC UpdateSales 288, &#8211;4000000;","html":"<p>EXEC UpdateSales 288, &#8211;4000000;</p>"},{"id":"text-42","type":"text","heading":"","plain_text":"Listing 11: Causer la procédure stockée UpdateSales pour générer une erreur \nUne fois de plus, SQL Server renvoie une erreur. Seulement cette fois, les informations sont plus précises. Comme vous pouvez le voir dans l&#39;extrait 12, les numéros de message et les numéros de ligne correspondent désormais. Nous n&#39;avons plus besoin de déclarer des variables ou d&#39;appeler des fonctions système pour renvoyer des informations relatives aux erreurs à l&#39;application appelante.","html":"<p>Listing 11: Causer la procédure stockée UpdateSales pour générer une erreur \nUne fois de plus, SQL Server renvoie une erreur. Seulement cette fois, les informations sont plus précises. Comme vous pouvez le voir dans l&#039;extrait 12, les numéros de message et les numéros de ligne correspondent désormais. Nous n&#039;avons plus besoin de déclarer des variables ou d&#039;appeler des fonctions système pour renvoyer des informations relatives aux erreurs à l&#039;application appelante.</p>"},{"id":"text-43","type":"text","heading":"","plain_text":"(0 rangée(s) affecté)\nRéel Erreur nombre: 547\nRéel ligne nombre: 8\nMsg 547, Niveau 16, Etat 0, Procédure UpdateSales, Ligne 8\nle MISE À JOUR déclaration en conflit avec le VÉRIFIER contrainte &quot;ckSalesTotal&quot;. le conflit eu lieu dans base de données &quot;AdventureWorks2012&quot;, table &quot;dbo.LastYearSales&quot;, colonne «SalesLastYear».","html":"<p>(0 rangée(s) affecté)\nRéel Erreur nombre: 547\nRéel ligne nombre: 8\nMsg 547, Niveau 16, Etat 0, Procédure UpdateSales, Ligne 8\nle MISE À JOUR déclaration en conflit avec le VÉRIFIER contrainte &quot;ckSalesTotal&quot;. le conflit eu lieu dans base de données &quot;AdventureWorks2012&quot;, table &quot;dbo.LastYearSales&quot;, colonne «SalesLastYear».</p>"},{"id":"text-44","type":"text","heading":"","plain_text":"Listing 12: Le message d&#39;erreur renvoyé par la procédure stockée UpdateSales \nComme vous pouvez le voir, SQL Server 2012 rend la gestion des erreurs plus facile que jamais. Même si vous utilisez le ESSAYEZ &#8230; bloquer pendant un certain temps, le JETER déclaration devrait prouver un grand avantage sur RAISERROR. Et si vous débutez dans la gestion des erreurs dans SQL Server, vous constaterez que le ESSAYEZ &#8230; bloc et JETER ensemble, le processus est assez indolore, il vaut bien le temps et les efforts nécessaires pour les apprendre et les mettre en œuvre.","html":"<p>Listing 12: Le message d&#039;erreur renvoyé par la procédure stockée UpdateSales \nComme vous pouvez le voir, SQL Server 2012 rend la gestion des erreurs plus facile que jamais. Même si vous utilisez le ESSAYEZ &#8230; bloquer pendant un certain temps, le JETER déclaration devrait prouver un grand avantage sur RAISERROR. Et si vous débutez dans la gestion des erreurs dans SQL Server, vous constaterez que le ESSAYEZ &#8230; bloc et JETER ensemble, le processus est assez indolore, il vaut bien le temps et les efforts nécessaires pour les apprendre et les mettre en œuvre.</p>"},{"id":"text-45","type":"text","heading":"","plain_text":"Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]","html":"<p>Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]</p>"}],"sections":[{"id":"text-1","heading":"Text","content":"Depuis la sortie de SQL Server 2005, vous pouvez gérer les erreurs dans votre code T-SQL en incluant un ESSAYEZ &#8230; bloc qui contrôle le flux de votre script en cas d&#39;erreur, semblable à la façon dont les langages procéduraux ont traditionnellement traité les erreurs. le ESSAYEZ &#8230; Le bloc facilite le retour ou l&#39;audit des données liées aux erreurs, ainsi que la prise d&#39;autres mesures. Et dans le bloc en particulier, le CAPTURE portion-vous avez pu inclure un RAISERROR afin de renvoyer les données relatives aux erreurs à l&#39;application appelante. Cependant, avec la version de SQL Server 2012, vous disposez désormais d&#39;un remplacement pour RAISERROR, le JETER , ce qui facilite plus que jamais la capture des données d&#39;erreur. \nDans cet article, nous allons voir le ESSAYEZ &#8230; bloc utilisé avec le RAISERROR et JETER déclarations. Les exemples sont basés sur un tableau que j&#39;ai créé dans le AdventureWorks2012 exemple de base de données, sur une instance locale de SQL Server 2012. Le listing 1 montre le script T-SQL que j&#39;ai utilisé pour créer le LastYearSales table."},{"id":"text-2","heading":"Text","content":"1\n2\n3\n4\n5\n6\n7\n8\n9\ndix\n11\n12\n13\n14\n15\n16\n17\n18"},{"id":"text-3","heading":"Text","content":"UTILISATION AdventureWorks2012;\nALLER"},{"id":"text-4","heading":"Text","content":"SI OBJECT_ID(«LastYearSales», «U») EST NE PAS NUL\nLAISSEZ TOMBER TABLE LastYearSales;\nALLER"},{"id":"text-5","heading":"Text","content":"SÉLECTIONNER\n  BusinessEntityID COMME SalesPersonID,\n  Prénom + &#39;&#39; + Nom de famille COMME Nom complet,\n  SalesLastYear\nDANS\n  LastYearSales\nDE\n  Ventes.vSalesPerson\nOÙ\n  SalesLastYear &gt; 0;\nALLER"},{"id":"text-6","heading":"Text","content":"Listing 1: Création de la table LastYearSales \nLe script devrait être assez simple. J&#39;utilise un CHOISIR… DANS pour récupérer les données de la Sales.vSalesPerson la visualiser et l&#39;insérer dans la table nouvellement créée. Cependant, pour montrer comment gérer les erreurs, nous devons ajouter un élément de plus à notre table: une contrainte de vérification qui garantit la SalesLastYear la valeur n&#39;est jamais inférieure à zéro. Le listing 2 montre le MODIFIER TABLE J&#39;ai utilisé pour ajouter la contrainte."},{"id":"text-7","heading":"Text","content":"MODIFIER TABLE LastYearSales\nAJOUTER CONTRAINTE ckSalesTotal VÉRIFIER (SalesLastYear &gt; = 0);\nALLER"},{"id":"text-8","heading":"Text","content":"Listing 2: Ajout d&#39;une contrainte de vérification à la table LastYearSales \nLa contrainte facilite la génération d&#39;une erreur lors de la mise à jour de la table. Tout ce que je dois faire, c&#39;est essayer d&#39;ajouter un montant négatif au SalesLastYear , un montant suffisamment élevé pour que SQL Server génère une erreur. Une fois que nous avons créé notre table et ajouté la contrainte de vérification, nous avons l&#39;environnement dont nous avons besoin pour les exemples de cet article. Vous pouvez tout aussi facilement créer votre propre table et l&#39;utiliser dans les exemples. Assurez-vous simplement d&#39;avoir un moyen de violer une contrainte ou de trouver un autre mécanisme pour générer une erreur. Le but est de créer un script qui gère toutes les erreurs. \nUne fois que nous avons configuré notre table, l&#39;étape suivante consiste à créer une procédure stockée qui montre comment gérer les erreurs. La procédure, UpdateSales, modifie la valeur dans le SalesLastYear dans la colonne LastYearSales table pour un vendeur spécifié. Il fonctionne en ajoutant ou en soustrayant un montant de la valeur actuelle dans cette colonne. Le listing 3 montre le script que j&#39;ai utilisé pour créer la procédure. Notez que j&#39;inclus deux paramètres d&#39;entrée-@SalesPersonID et @SalesAmt-qui coïncident avec la table SalesPersonID et SalesLastYear Colonnes."},{"id":"text-9","heading":"Text","content":"1\n2\n3\n4\n5\n6\n7\n8\n9\ndix\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36"},{"id":"text-10","heading":"Text","content":"UTILISATION AdventureWorks2012;\nALLER"},{"id":"text-11","heading":"Text","content":"SI OBJECT_ID(«UpdateSales», «P») EST NE PAS NUL\nLAISSEZ TOMBER PROCÉDURE UpdateSales;\nALLER"},{"id":"text-12","heading":"Text","content":"CRÉER PROCÉDURE UpdateSales\n  @SalesPersonID INT,\n  @SalesAmt ARGENT = 0\nCOMME\nCOMMENCER\n  COMMENCER ESSAYER\n    COMMENCER TRANSACTION;\n      MISE À JOUR LastYearSales\n      ENSEMBLE SalesLastYear = SalesLastYear + @SalesAmt\n      OÙ SalesPersonID = @SalesPersonID;\n    COMMETTRE TRANSACTION;\n  FIN ESSAYER\n  COMMENCER CAPTURE\n    SI @@TRANCOUNT &gt; 0\n    RETOUR EN ARRIERE TRANSACTION;"},{"id":"text-13","heading":"Text","content":"DÉCLARER @ErrorNumber INT = ERROR_NUMBER();\n    DÉCLARER @ErrorLine INT = ERROR_LINE();\n    DÉCLARER @Message d&#39;erreur NVARCHAR(4000) = MESSAGE D&#39;ERREUR();\n    DÉCLARER @ErrorSeverity INT = ERROR_SEVERITY();\n    DÉCLARER @ErrorState INT = ERROR_STATE();"},{"id":"text-14","heading":"Text","content":"IMPRESSION &#39;Numéro d&#39;erreur réel:&#39; + JETER(@ErrorNumber COMME VARCHAR(dix));\n    IMPRESSION &#39;Numéro de ligne réel:&#39; + JETER(@ErrorLine COMME VARCHAR(dix));"},{"id":"text-15","heading":"Text","content":"RAISERROR(@Message d&#39;erreur, @ErrorSeverity, @ErrorState);\n  FIN CAPTURE\nFIN;\nALLER"},{"id":"text-16","heading":"Text","content":"Listing 3: Création d&#39;une procédure stockée contenant un bloc Try… Catch \nLe corps principal de la définition de la procédure, inclus dans le COMMENCER… FIN bloc, contient le ESSAYEZ &#8230; bloc, lui-même divisé en ESSAYER bloc et CAPTURE bloquer. le ESSAYER le bloc commence par DÉBUT et se termine par ENDTRY et contient le T-SQL nécessaire pour exécuter les actions de la procédure. Dans ce cas, j&#39;inclus un MISE À JOUR déclaration qui ajoute le @Montant des ventes valeur à la SalesLastYear colonne. La déclaration est incluse dans DÉBUT DE TRANSACTION et COMMITTRANSACTION pour démarrer et valider explicitement la transaction. Les exemples varient en fonction de l&#39;endroit où ils incluent les déclarations relatives aux transactions. (Certains n&#39;incluent pas du tout les relevés.) Gardez simplement à l&#39;esprit que vous souhaitez valider ou annuler vos transactions aux moments appropriés, selon qu&#39;une erreur a été générée. \nSi la MISE À JOUR s&#39;exécute avec succès, le SalesLastYear est mise à jour et l&#39;opération est terminée, auquel cas le code dans le CAPTURE le bloc n&#39;est jamais exécuté. Cependant, si le MISE À JOUR échoue et SQL Server génère une erreur, la transaction est terminée et le moteur de base de données passe à la CAPTURE bloquer. le CAPTURE le bloc commence par BEGINCATCH et se termine par ENDCATCH et contient les instructions nécessaires pour gérer l&#39;erreur. \nPour la procédure stockée dans le Listing 3, la première étape que je prends dans le CAPTURE le bloc consiste à annuler la transaction si elle est toujours en cours d&#39;exécution. Je commence par utiliser le @@ TRANCOUNT pour déterminer si des transactions sont encore ouvertes. @@ TRANCOUNT est une fonction SQL Server intégrée qui renvoie le nombre de transactions en cours d&#39;exécution dans la session en cours. Dans ce cas, il ne devrait y en avoir qu&#39;un (si une erreur se produit), donc j&#39;annule cette transaction. \nEnsuite, je déclare un ensemble de variables basées sur les fonctions système que SQL Server met à disposition dans le cadre de la CAPTURE bloquer. Les fonctions renvoient des informations relatives aux erreurs que vous pouvez référencer dans vos instructions T-SQL. Actuellement, SQL Server prend en charge les fonctions suivantes à cette fin:"},{"id":"text-17","heading":"Text","content":"ERROR_NUMBER (): Le numéro attribué à l&#39;erreur.  \nERROR_LINE (): Numéro de ligne dans la routine qui a provoqué l&#39;erreur.  \nMESSAGE D&#39;ERREUR(): Le texte du message d&#39;erreur, qui inclut les valeurs fournies pour tous les paramètres substituables, tels que les heures ou les noms d&#39;objets.  \nERROR_SEVERITY (): La gravité de l&#39;erreur.  \nERROR_STATE (): Numéro d&#39;état de l&#39;erreur.  \nERROR_PROCEDURE (): Nom de la procédure stockée ou du déclencheur qui a généré l&#39;erreur."},{"id":"text-18","heading":"Text","content":"Pour cet exemple, j&#39;utilise toutes les fonctions sauf la dernière, mais dans un environnement de production, vous pouvez également utiliser celle-ci. \nAprès avoir déclaré les variables, j&#39;inclus deux IMPRESSION des instructions qui affichent les valeurs de la @ErrorNumber et @ErrorLine variables (avec un texte explicatif). La raison pour laquelle je fais cela est de démontrer la différence entre ce que sont les valeurs réelles et ce que le RAISERROR comme vous le verrez sous peu. \nle RAISERROR déclaration vient après la IMPRESSION déclarations. L&#39;instruction renvoie des informations d&#39;erreur à l&#39;application appelante. Généralement, lors de l&#39;utilisation RAISERROR, vous devez inclure un message d&#39;erreur, un niveau de gravité d&#39;erreur et un état d&#39;erreur. Les règles qui régissent le RAISERROR les arguments et les valeurs qu&#39;ils renvoient sont un peu complexes et dépassent le cadre de cet article, mais pour les besoins de cet exemple, je passe simplement @Message d&#39;erreur, @ErrorSeverity, et @ErrorState variables comme arguments."},{"id":"text-19","heading":"Text","content":"REMARQUE: Pour plus d&#39;informations sur l&#39;instruction RAISERROR, consultez la rubrique «RAISERROR (Transact-SQL)» dans la documentation en ligne de SQL Server."},{"id":"text-20","heading":"Text","content":"C&#39;est tout ce que vous devez faire pour créer une procédure stockée contenant un ESSAYEZ &#8230; bloquer. Dans un instant, nous allons essayer notre travail. Mais d&#39;abord, récupérons une ligne de la LastYearSales tableau pour voir quelle est la valeur actuelle pour le vendeur 288. Le listing 4 montre le SÉLECTIONNER J&#39;ai utilisé pour récupérer les données."},{"id":"text-21","heading":"Text","content":"SÉLECTIONNER Nom complet, SalesLastYear\nDE LastYearSales\nOÙ SalesPersonID = 288"},{"id":"text-22","heading":"Text","content":"Listing 4: Récupération de la date dans la table LastYearSales \nSans surprise, la déclaration renvoie le nom et les ventes totales de ce vendeur, comme indiqué dans le listing 5. Comme vous pouvez le voir, Rachel Valdez affiche plus de 1,3 million de dollars de ventes pour l&#39;année dernière."},{"id":"text-23","heading":"Text","content":"Nom complet\t\tSalesLastYear\nRachel Valdez\t\t1307949.7917"},{"id":"text-24","heading":"Text","content":"Listing 5: Données extraites de la table LastYearSales \nEssayons maintenant le UpdateSales procédure stockée. Juste pour le plaisir, ajoutons quelques millions de dollars aux totaux de Rachel Valdez. Le listing 6 montre comment j&#39;utilise le EXEC déclaration pour appeler la procédure et transmettre l&#39;ID du vendeur et les 2 millions de dollars."},{"id":"text-25","heading":"Text","content":"EXEC UpdateSales 288, 2000000;"},{"id":"text-26","heading":"Text","content":"Listing 6: Exécution de la procédure stockée UpdateSales \nLa procédure stockée doit s&#39;exécuter sans problème car nous ne violons pas la contrainte de vérification. Si nous devions exécuter la SÉLECTIONNER à nouveau (celle de l&#39;extrait 4), nos résultats ressembleraient à ceux de l&#39;extrait 7. Notez tout l&#39;argent supplémentaire."},{"id":"text-27","heading":"Text","content":"Nom complet\t\tSalesLastYear\nRachel Valdez\t\t3307949.7917"},{"id":"text-28","heading":"Text","content":"Listing 7: Affichage du montant des ventes mis à jour dans le tableau LastYearSales \nVoyons maintenant ce qui se passe si nous soustrayons suffisamment de son compte pour ramener ses totaux en dessous de zéro. Dans la liste 8, je lance à nouveau la procédure, mais cette fois précisez -4000000 pour le montant."},{"id":"text-29","heading":"Text","content":"EXEC UpdateSales 288, &#8211;4000000;"},{"id":"text-30","heading":"Text","content":"Listing 8: Causer la procédure stockée UpdateSales pour générer une erreur \nComme vous vous en souvenez, après avoir créé le LastYearSales table, j&#39;ai ajouté une contrainte de vérification pour s&#39;assurer que le montant ne pouvait pas tomber en dessous de zéro. Par conséquent, la procédure stockée génère maintenant une erreur, qui est indiquée dans le listing 9."},{"id":"text-31","heading":"Text","content":"(0 rangée(s) affecté)\nRéel Erreur nombre: 547\nRéel ligne nombre: 9\nMsg 50000, Niveau 16, Etat 0, Procédure UpdateSales, Ligne 27\nle MISE À JOUR déclaration en conflit avec le VÉRIFIER contrainte &quot;ckSalesTotal&quot;. le conflit eu lieu dans base de données &quot;AdventureWorks2012&quot;, table &quot;dbo.LastYearSales&quot;, colonne «SalesLastYear»."},{"id":"text-32","heading":"Text","content":"Listing 9: Le message d&#39;erreur renvoyé par la procédure stockée UpdateSales \nComme prévu, les informations que nous avons incluses dans le CAPTURE bloc a été retourné. Mais notez que le numéro d&#39;erreur réel (547) est différent du RAISERROR numéro de message (50000) et que le numéro de ligne réel (9) est différent du RAISERROR numéro de ligne (27). En théorie, ces valeurs devraient coïncider. Mais comme je l&#39;ai mentionné plus tôt, les règles qui régissent RAISERROR sont un peu excentriques. \nPour simplifier le renvoi d&#39;erreurs dans un CAPTURE bloc, SQL Server 2012 a introduit le JETER déclaration. Avec le JETER , vous n&#39;avez pas besoin de spécifier de paramètres et les résultats sont plus précis. Vous incluez simplement la déclaration telle quelle dans le CAPTURE bloquer."},{"id":"text-33","heading":"Text","content":"REMARQUE: Vous pouvez utiliser le JETER déclaration en dehors de la CAPTURE bloc, mais vous devez inclure des valeurs de paramètre pour ce faire. Pour plus d&#39;informations sur le JETER , consultez la rubrique «THROW (Transact-SQL)» dans la documentation en ligne de SQL Server."},{"id":"text-34","heading":"Text","content":"Pour démontrer la JETER déclaration, j&#39;ai défini un ALTER PROCEDURE déclaration qui modifie la UpdateSales procédure, en particulier la CAPTURE bloc, comme indiqué dans l&#39;extrait 10."},{"id":"text-35","heading":"Text","content":"1\n2\n3\n4\n5\n6\n7\n8\n9\ndix\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26"},{"id":"text-36","heading":"Text","content":"MODIFIER PROCÉDURE UpdateSales\n  @SalesPersonID INT,\n  @SalesAmt ARGENT = 0\nCOMME\nCOMMENCER\n  COMMENCER ESSAYER\n    COMMENCER TRANSACTION;\n      MISE À JOUR LastYearSales\n      ENSEMBLE SalesLastYear = SalesLastYear + @SalesAmt\n      OÙ SalesPersonID = @SalesPersonID;\n    COMMETTRE TRANSACTION;\n  FIN ESSAYER\n  COMMENCER CAPTURE\n    SI @@TRANCOUNT &gt; 0\n    RETOUR EN ARRIERE TRANSACTION;"},{"id":"text-37","heading":"Text","content":"DÉCLARER @ErrorNumber INT = ERROR_NUMBER();\n    DÉCLARER @ErrorLine INT = ERROR_LINE();"},{"id":"text-38","heading":"Text","content":"IMPRESSION &#39;Numéro d&#39;erreur réel:&#39; + JETER(@ErrorNumber COMME VARCHAR(dix));\n    IMPRESSION &#39;Numéro de ligne réel:&#39; + JETER(@ErrorLine COMME VARCHAR(dix));"},{"id":"text-39","heading":"Text","content":"JETER;\n  FIN CAPTURE\nFIN;\nALLER"},{"id":"text-40","heading":"Text","content":"Listing 10: Modification de la procédure stockée UpdateSales \nNotez que je conserve le @ErrorNumber et @ErrorLine déclarations de variables et leurs connexes IMPRESSION déclarations. Je le fais uniquement pour démontrer la JETER l&#39;exactitude de la déclaration. En fait, je dois seulement annuler la transaction et spécifier le JETER , sans aucun paramètre. \nMaintenant, exécutons à nouveau la procédure stockée, en essayant à nouveau de déduire 4 millions de dollars du montant des ventes, comme indiqué dans le listing 11."},{"id":"text-41","heading":"Text","content":"EXEC UpdateSales 288, &#8211;4000000;"},{"id":"text-42","heading":"Text","content":"Listing 11: Causer la procédure stockée UpdateSales pour générer une erreur \nUne fois de plus, SQL Server renvoie une erreur. Seulement cette fois, les informations sont plus précises. Comme vous pouvez le voir dans l&#39;extrait 12, les numéros de message et les numéros de ligne correspondent désormais. Nous n&#39;avons plus besoin de déclarer des variables ou d&#39;appeler des fonctions système pour renvoyer des informations relatives aux erreurs à l&#39;application appelante."},{"id":"text-43","heading":"Text","content":"(0 rangée(s) affecté)\nRéel Erreur nombre: 547\nRéel ligne nombre: 8\nMsg 547, Niveau 16, Etat 0, Procédure UpdateSales, Ligne 8\nle MISE À JOUR déclaration en conflit avec le VÉRIFIER contrainte &quot;ckSalesTotal&quot;. le conflit eu lieu dans base de données &quot;AdventureWorks2012&quot;, table &quot;dbo.LastYearSales&quot;, colonne «SalesLastYear»."},{"id":"text-44","heading":"Text","content":"Listing 12: Le message d&#39;erreur renvoyé par la procédure stockée UpdateSales \nComme vous pouvez le voir, SQL Server 2012 rend la gestion des erreurs plus facile que jamais. Même si vous utilisez le ESSAYEZ &#8230; bloquer pendant un certain temps, le JETER déclaration devrait prouver un grand avantage sur RAISERROR. Et si vous débutez dans la gestion des erreurs dans SQL Server, vous constaterez que le ESSAYEZ &#8230; bloc et JETER ensemble, le processus est assez indolore, il vaut bien le temps et les efforts nécessaires pour les apprendre et les mettre en œuvre."},{"id":"text-45","heading":"Text","content":"Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]"}],"media":{"primary_image":"https://tutos-gameserver.fr/wp-content/uploads/2020/05/SimpleTalk.png"},"relations":[{"rel":"canonical","href":"https://tutos-gameserver.fr/2020/05/08/gestion-des-erreurs-dans-sql-server-2012-bien-choisir-son-serveur-d-impression/"},{"rel":"alternate","href":"https://tutos-gameserver.fr/2020/05/08/gestion-des-erreurs-dans-sql-server-2012-bien-choisir-son-serveur-d-impression/llm","type":"text/html"},{"rel":"alternate","href":"https://tutos-gameserver.fr/2020/05/08/gestion-des-erreurs-dans-sql-server-2012-bien-choisir-son-serveur-d-impression/llm.json","type":"application/json"},{"rel":"llm-manifest","href":"https://tutos-gameserver.fr/llm-endpoints-manifest.json","type":"application/json"}],"http_headers":{"X-LLM-Friendly":"1","X-LLM-Schema":"1.1.0","Content-Security-Policy":"default-src 'none'; img-src * data:; style-src 'unsafe-inline'"},"license":"CC BY-ND 4.0","attribution_required":true,"allow_cors":false}