2009-12-09 11 views
2

Je souhaite appeler un SP à partir d'un autre SP. Je sais que je peux facilement l'appeler. Mais le problème est, si une erreur se produit dans SP2, alors je veux ROLLBACK SP1.Appel d'une procédure stockée à partir d'une autre procédure stockée

SP1
BEGIN Tran
[Certains Code]
Appel à SP2
[Certains Code]

SP2
BEGIN TRAN
[Certains Code]
[Erreur Comes]
ROLLBACK TRAN

Cela annulerait Tran dans sp2 uniquement. Je veux aussi RollBack SP1, si une erreur se produit dans sp2.

Toute aide serait appréciée.

+2

@vaibhav: J'ai mis à jour l'étiquette 'sqlserver2005' à' sql-server-2005'. Envisageriez-vous d'utiliser des balises existantes? Merci. – Sung

+0

Pour tout ce que vous vouliez savoir sur le traitement des erreurs mais que vous aviez peur de demander, Erland Sommarskog a un excellent article (bien que non terminé) à ce sujet: http://sommarskog.se/error_handling_2005.html ... il est également lié à ses deux articles pour SQL Server 2000, mais plusieurs des concepts s'appliquent toujours dans les versions plus récentes. –

Répondre

2

semble que les gens ont des problèmes avec d'autres sites d'information ...

L'essentiel de ce que la procédure de parent par une exception en essayant d'effectuer un ROLLBACK comme l'enfant a déjà. La solution consiste à demander au parent de vérifier le @trancount avant de valider.

http://forums.asp.net/t/1259708.aspx

Create procedure [dbo].[parent] as Begin Transaction Begin Try 
    Exec Child End Try Begin Catch 
    If @@Trancount > 0 
     RollBack End Catch Commit 


Create procedure [dbo].[Child] as Begin Transaction Begin Try 
    --Do inserts here End Try Begin Catch 
    If @@Trancount > 0 
     RollBack 
    RAISERROR('Error Occured',16,1) End Catch Commit 
+1

Vous ne lien pas à ce site à partir d'ici.;-) – Tomalak

+0

ne peut rien voir sur votre lien. –

+0

Merci, puis-je utiliser @@ erreur pour vérifier le 'erreur surélevée' –

1

Une possibilité consiste à créer SP2 avec un paramètre @ErrorCode INT OUTPUT qui indique si l'appelant doit annuler ou valider.

+0

Ou utilisez des valeurs de retour. – erikkallen

4

Essayez RAISERROR dans SP2.

+0

Pouvez-vous s'il vous plaît élaborer. –

+0

Le fait de déclencher une erreur dans le Service Pack 2 doit également provoquer l'annulation de la transaction par SP1. Faites-vous un roll-back manuel ou automatique? – Tomalak

+0

Son automatique, en utilisant "Rollback Tran" –

0

Créez un paramètre de sortie dans votre deuxième SP qui est de type bit, indiquant si une erreur est survenue ou non. Sur cette base, vous pouvez rollback SP 1.

1

vous pouvez utiliser un code d'erreur comme ça (je ne suis pas écrire le code juste comment puis-je faire si je vous étais)

SP1 
DECLARE ReturnVal 
BEGIN TRAN 
CODE 
CALL SP1 ReturnVal output 
IF ReturnVal=errorvalue 
ROLLBACK TRAN 

SP2 
DECLARE ReturnVal output 
BEGIN TRAN 
CODE 
ERROR 
SET ReturnVal=errorVal 
ROLLBACK 
RETURN ReturnVal 
1

Il ne ressemble pas à vous besoin des transactions imbriquées. Essayez contrôle commit/rollback avec des blocs d'essayer (de psuedocode):

begin try 
    begin trans 
    do stuff 
    call other sp 
    do more stuff 
    commit trans 
end try 
begin catch 
    rollback trans 
    do something here to report failure to app 
end catch 

Si une erreur se produit partout dans le bloc d'essai, y compris withing l'autre sp, le contrôle passe au bloc catch et annuler la transaction.

+0

Je pense que cela vaut la peine d'envisager. Mais je ne devrais pas utiliser un paramètre de sortie, comme d'autres le disent. –

+0

@valbhav: Envisagez d'utiliser à la fois 'RAISERROR' et' TRY ... CATCH' ... – Sung

+0

Mon système va détecter les erreurs 'relancées' par vous ou par le serveur. Si vous avez besoin de signaler des erreurs d'affaires depuis le second sp, vous pouvez appeler raiserror comme d'autres l'ont suggéré, ce que ma tentative d'attraper attraperait. Ou vous pouvez utiliser un paramètre de sortie pour signaler l'erreur. Dans ce cas, le try-catch ne vous aidera pas et vous devrez faire une instruction 'if' ou quelque chose pour tester la valeur retournée. Même ainsi, try try est toujours agréable à attraper des erreurs inattendues. – Ray

Questions connexes