Je travaille sur le script sql et je dois arrêter de continuer le script si certaines conditions ne sont pas remplies.
Lorsque je le recherche sur Google, j'ai trouvé que la RaisError avec un niveau de gravité de 20 y mettrait fin. Mais pour certaines raisons, je ne peux pas utiliser cette option.
Pouvez-vous me fournir quelles sont les alternatives possibles pour arrêter l'exécution du script SQL.
sql-server
sql-server-2005
error-handling
Nouveau développeur
la source
la source
Réponses:
De la documentation RAISERROR (soulignement le mien):
Il est fort probable que le principal que vous exécutez le script ne remplit pas ces critères.
Il n'y a rien de mal à utiliser
RAISERROR
; vous utilisez simplement un niveau de gravité excessif. J'utilise le niveau 16 par défaut pour une erreur qui est déclenchée et la séquence sera terminée. Si vous voulez être plus précis, vous pouvez suivre les niveaux donnés par Microsoft lui-même:Maintenant, après avoir dit tout cela, selon le contexte du script, l'utilisation
RAISERROR
peut ne pas être suffisante, car elle ne "quitte" pas le script lui-même (en utilisant des niveaux de gravité normaux).Par exemple:
Cela provoquera à la fois une erreur et retournera un jeu de résultats.
Pour terminer le script immédiatement, je préfère utiliser
RETURN
(l'utilisation deGOTO
constructions de type est généralement déconseillée dans la plupart des cercles de programmation où des alternatives existent):Ou gérez l'erreur à l'aide de
TRY/CATCH
, ce qui provoquera l'exécution pour sauter auCATCH
bloc si la gravité est 11 ou plus:Un problème distinct est si le script s'étend sur plusieurs lots -
RETURN
ne quittera que le lot :Pour résoudre ce problème, vous pouvez vérifier
@@ERROR
au début de chaque lot:Edit: Comme Martin Smith le souligne correctement dans les commentaires, cela ne fonctionne que pour 2 lots. Pour étendre à 3 lots ou plus, vous pouvez cascader des erreurs de génération comme ceci (remarque: la
GOTO
méthode ne résout pas ce problème car l'étiquette cible doit être définie dans le lot):Ou, comme il le souligne également, vous pouvez utiliser la
SQLCMD
méthode si cela convient à votre environnement.la source
Vous pouvez utiliser l'
GOTO
instruction pour sauter partout où vous le souhaitez. En d'autres termes, vous rencontrez une erreur ou une autre condition, et vous pouvez avoir une étiquette au bas du script (c'est-à-direTheEndOfTheScript:
) et simplement émettre unegoto TheEndOfTheScript;
instruction.Voici un petit échantillon:
Le résultat de cette exécution sera le suivant:
Comme vous pouvez le voir, le
GOTO
a sauté l'impression des troisième et quatrième instructions et a sauté directement sur l'étiquette (TheEndOfTheScript
).la source
La meilleure façon est d'utiliser SET NOEXEC ON
Vous pouvez en savoir plus ici: Comment arrêter ou interrompre ou interrompre l'exécution des instructions dans le lot en cours et dans les lots suivants séparés par l'instruction GO en fonction d'une condition dans SQL SERVER
la source
D'accord avec le
SET NOEXEC ON/OFF
, cependant dans Stored Procs (contenant un seul bloc) j'utilise simplement laRETURN
déclaration.Avertissements: dans un fichier de script, si vous avez plusieurs
GO
instructions, leRETURN
ne sortira que du bloc actuel et continuera avec le bloc / lot suivant.Remarque:
GOTO
est censé être une mauvaise pratique de codage, l'utilisation de "TRY..CATCH
" est recommandée, car elle a été introduite depuis SQL Server 2008, puisTHROW
en 2012.la source