2009-08-06 5 views
4

(SQL 2005) Est-il possible pour un raiserror de terminer un proc stocké? Par exemple, dans un système volumineux, nous avons une valeur qui n'était pas attendue dans une colonne spécifique. Dans un déclencheur de mise à jour si vous écrivez:Terminaison d'instruction SQL à l'aide de RAISERROR

si elle existe (select * from inséré où testcol = 7) commencer RaiseError ('Mon erreur personnalisée', 16, 1) fin

les informations de mise à jour est toujours appliqué. si vous exécutez

si elle existe (select * from inséré où testcol = 7) commencent sélectionner 1/0 fin

une division par 0 erreur est levée qui se termine en fait la mise à jour. est-il possible de faire cela avec un raiseerror afin que je puisse récupérer des messages d'erreur personnalisés?

Répondre

6

Dans un déclencheur, émettez un ROLLBACK, RAISERROR puis RETURN.

voir Error Handling in SQL Server - Trigger Context by Erland Sommarskog

+0

Aussi ce lien http://support.microsoft.com/kb/45581 – pjp

+0

Est-ce seulement valable pour une transaction? ou sont déclencheurs trasactional? – Bob

+0

A partir du lien que j'ai posté 'Lorsque dans un déclencheur, il n'est pas nécessaire d'avoir une instruction BEGIN TRANSACTION correspondante car chaque instruction SQL qui n'est pas dans une transaction explicite est effectivement une transaction à une seule instruction.' – pjp

0

Vous devriez vérifier les données valides avant d'effectuer la mise à jour.

IF (@testvalue = 7) 
    RAISERROR("Invalid value.", 16, 1); 
ELSE 
    UPDATE... 
+0

si les modifications de données entre le contrôle et la mise à jour? –

+0

Les données de cet exemple sont un paramètre d'entrée et ne doivent pas changer à moins que le sproc ne le modifie explicitement. – pjp

+0

Je ne sais pas quel sproc met à jour ceci ou si c'est un travail de base de données nocturne, donc je ne peux pas vérifier la valeur avant de le mettre à jour. – Bob

1

Pouvez-vous pas ajouter juste un VERIFIER contrainte à la colonne pour l'empêcher d'être inséré en premier lieu?

ALTER TABLE YourTable ADD CONSTRAINT CK_No_Nasties 
    CHECK (testcol <> 7) 

Sinon, vous pouvez démarrer une transaction dans votre insert sproc (si vous en avez un) et rouler si une erreur se produit. Cela peut être implémenté avec TRY, CATCH dans SQL Server 2005 et évite d'avoir à utiliser un déclencheur.

1
Begin try 
@temp number 
@temp=1/0 
End try 
Begin catch 
@errormsg varchar(100) 
@errormsg=error_massage() 
Raiseerror(@errormsg,16,1) 
End catch 
+1

Pouvez-vous ajouter une description pour votre solution? – Ren

Questions connexes