set xact_abort et essayez de les attraper ensemble
j'ai un bloc try catch dans mon sp avec juste une instruction insert dans le coup d'essayer. le hic, vérifiez le code d'erreur si c'est pk violation, si c'est pour faire la mise à jour. mais quelques fois, j'obtiens "La transaction en cours ne peut être engagée et ne supporte pas les opérations d'écriture dans le fichier journal. Annuler la transaction.
Non validable transaction est détectée à la fin du lot. La transaction est annulée." j'ai donc ajouté xact_abort on, mais ensuite, je reçois "nombre de Transactions après EXECUTE indique des différences de nombre de lancer et valider les déclarations." et j'ai trouvé ceci.
http://www.ashishsheth.com/post/2009/08/14/Set-XACT_ABORT-ON-and-TryCatch-block-in-Sql-Server-2005.aspx
si cela vrai. mon code catch pas fonctionner si il y a une erreur dans mon bloc try avec xact_abort on?
OriginalL'auteur satuday | 2013-04-05
Vous devez vous connecter pour publier un commentaire.
C'est pas vrai, au moins avec SQL SERVER 2008, qui SET XACT_ABORT on va provoquer une erreur de sauter le bloc CATCH:
Voici le code que j'ai essayé d'utiliser la base de données Northwind
Ce sera, de toute évidence, la force d'une erreur quand il frappe les SÉLECTIONNER 1/0 déclaration. Avec SET XACT_ABORT, quand le bloc CATCH est atteint, la valeur retournée par la XACT_STATE() la fonction est de 1, entraînant l'exécution du code qui valide la transaction. Lorsque SET XACT_ABORT est sur, la valeur retournée, dans le bloc CATCH est de -1 de sorte que le code qui annule la transaction est exécutée.
Ceci est basé sur:
http://msdn.microsoft.com/en-us/library/ms175976.aspx
OriginalL'auteur Michael Harmon
Permettez-moi d'ajouter que, dans ce scénario particulier (essayez de l'insérer, si PK violation ensuite de capture et de mise à jour), il serait préférable d'utiliser if EXISTS (select....) pour voir si la ligne est là et placez votre instruction de mise à JOUR. Placez votre instruction INSERT dans le bloc ELSE. Beaucoup plus propre.
OriginalL'auteur Jun Sato