La méthode raiserror
raiserror('Oh no a fatal error', 20, -1) with log
Cela mettra fin à la connexion, arrêtant ainsi le reste du script de s'exécuter.
Notez que le niveau de gravité 20 ou supérieur et l' WITH LOG
option sont nécessaires pour que cela fonctionne de cette façon.
Cela fonctionne même avec les instructions GO, par exemple.
print 'hi'
go
raiserror('Oh no a fatal error', 20, -1) with log
go
print 'ho'
Vous donnera la sortie:
hi
Msg 2745, Level 16, State 2, Line 1
Process ID 51 has raised user error 50000, severity 20. SQL Server is terminating this process.
Msg 50000, Level 20, State 1, Line 1
Oh no a fatal error
Msg 0, Level 20, State 0, Line 0
A severe error occurred on the current command. The results, if any, should be discarded.
Notez que «ho» n'est pas imprimé.
CAVEATS:
- Cela ne fonctionne que si vous êtes connecté en tant qu'administrateur (rôle «sysadmin») et vous laisse également sans connexion à la base de données.
- Si vous n'êtes PAS connecté en tant qu'administrateur, l'appel RAISEERROR () lui-même échouera et le script continuera de s'exécuter .
- Lorsqu'il est appelé avec sqlcmd.exe, le code de sortie 2745 sera signalé.
Référence: http://www.mydatabasesupport.com/forums/ms-sqlserver/174037-sql-server-2000-abort-whole-script.html#post761334
La méthode noexec
Une autre méthode qui fonctionne avec les instructions GO est set noexec on
. Cela provoque le reste du script à ignorer. Il ne met pas fin à la connexion, mais vous devez la noexec
désactiver à nouveau avant l'exécution de toute commande.
Exemple:
print 'hi'
go
print 'Fatal error, script will not continue!'
set noexec on
print 'ho'
go
-- last line of the script
set noexec off -- Turn execution back on; only needed in SSMS, so as to be able
-- to run this script again in the same session.
Utilisez simplement un RETOUR (cela fonctionnera à l'intérieur et à l'extérieur d'une procédure stockée).
la source
Si vous pouvez utiliser le mode SQLCMD, l'incantation
(Y COMPRIS les deux points) entraînera RAISERROR réellement arrêter le script. Par exemple,
affichera:
et le lot s'arrêtera. Si le mode SQLCMD n'est pas activé, vous obtiendrez une erreur d'analyse sur les deux points. Malheureusement, ce n'est pas complètement à l'épreuve des balles comme si le script était exécuté sans être en mode SQLCMD, SQL Managment Studio passe au-delà même des erreurs de temps d'analyse! Pourtant, si vous les exécutez à partir de la ligne de commande, c'est très bien.
la source
Je n'utiliserais pas RAISERROR - SQL a des instructions IF qui peuvent être utilisées à cette fin. Effectuez votre validation et vos recherches et définissez des variables locales, puis utilisez la valeur des variables dans les instructions IF pour rendre les insertions conditionnelles.
Vous n'auriez pas besoin de vérifier un résultat variable de chaque test de validation. Vous pouvez généralement le faire avec une seule variable indicateur pour confirmer toutes les conditions remplies:
Même si votre validation est plus complexe, vous ne devriez avoir besoin que de quelques variables d'indicateur à inclure dans vos vérifications finales.
la source
RAISERROR
, surtout si vous ne savez pas qui va exécuter les scripts et avec quels privilèges.declare @i int = 0; if @i=0 begin select '1st stmt in IF block' go end else begin select 'ELSE here' end go
Dans SQL 2012+, vous pouvez utiliser THROW .
Depuis MSDN:
la source
J'ai étendu la solution marche / arrêt noexec avec succès avec une transaction pour exécuter le script de manière tout ou rien.
Apparemment, le compilateur "comprend" la variable @finished dans l'IF, même s'il y a eu une erreur et que l'exécution a été désactivée. Cependant, la valeur n'est définie sur 1 que si l'exécution n'a pas été désactivée. Par conséquent, je peux bien valider ou annuler la transaction en conséquence.
la source
IF (XACT_STATE()) <> 1 BEGIN Set NOCOUNT OFF ;THROW 525600, 'Rolling back transaction.', 1 ROLLBACK TRANSACTION; set noexec on END;
Mais l'exécution n'a jamais cessé, et j'ai fini avec trois erreurs de "Rolling back Transaction". Des idées?vous pouvez envelopper votre instruction SQL dans une boucle WHILE et utiliser BREAK si nécessaire
la source
DECLARE @ST INT; SET @ST = 1; WHILE @ST = 1; BEGIN; SET @ST = 0; ...; END
Plus verbeux, mais bon, c'est TSQL quand même ;-)Vous pouvez modifier le flux d'exécution à l'aide des instructions GOTO :
la source
Pour affiner la méthode Sglasses, les lignes ci-dessus forcent l'utilisation du mode SQLCMD et tréminent le scirpt si elles n'utilisent pas le mode SQLCMD ou utilisent
:on error exit
pour quitter en cas d'erreurCONTEXT_INFO est utilisé pour garder une trace de l'état.
la source
S'agit-il d'une procédure stockée? Si c'est le cas, je pense que vous pouvez simplement faire un retour, comme "Return NULL";
la source
Je suggère que vous enveloppiez votre bloc de code approprié dans un bloc try catch. Vous pouvez ensuite utiliser l'événement Raiserror avec une gravité de 11 afin de passer au bloc catch si vous le souhaitez. Si vous souhaitez simplement augmenter les erreurs mais continuer l'exécution dans le bloc try, utilisez une gravité inférieure.
Ça a du sens?
À la vôtre, John
[Modifié pour inclure la référence BOL]
http://msdn.microsoft.com/en-us/library/ms175976(SQL.90).aspx
la source
vous pouvez utiliser RAISERROR .
la source
Aucun de ces éléments ne fonctionne avec des instructions «GO». Dans ce code, que la gravité soit de 10 ou 11, vous obtenez l'instruction finale PRINT.
Script de test:
Résultats:
La seule façon de faire ce travail est d'écrire le script sans
GO
instructions. Parfois, c'est facile. Parfois, c'est assez difficile. (Utilisez quelque chose commeIF @error <> 0 BEGIN ...
.)la source
J'utilise
RETURN
ici tout le temps, travaille en script ouStored Procedure
Assurez-vous que vous
ROLLBACK
la transaction si vous êtes en un, sinonRETURN
immédiatement entraînera une transaction non validée ouvertela source
C'était ma solution:
...
la source
Vous pouvez utiliser l'instruction GOTO. Essaye ça. C'est une utilisation complète pour vous.
la source
Merci pour la réponse!
raiserror()
fonctionne bien mais vous ne devez pas oublier l'return
instruction sinon le script continue sans erreur! (hense le raiserror n'est pas un "throwerror" ;-)) et bien sûr faire un rollback si nécessaire!raiserror()
est agréable de dire à la personne qui exécute le script que quelque chose s'est mal passé.la source
Si vous exécutez simplement un script dans Management Studio et que vous souhaitez arrêter l'exécution ou la transaction de restauration (si elle est utilisée) à la première erreur, alors la meilleure façon, je pense, est d'utiliser le bloc try catch (à partir de SQL 2005). Cela fonctionne bien dans Management Studio si vous exécutez un fichier de script. Le proc stocké peut toujours l'utiliser également.
la source
À l'époque, nous utilisions les éléments suivants ... qui fonctionnaient le mieux:
la source
Placez-le dans un bloc try catch, puis l'exécution sera transférée vers catch.
la source