D'autres réponses ont souligné que CASE est une expression , pas une déclaration, et ne peut donc pas englober lui-même des déclarations (comme RAISEERROR
ou d'autres). Si les conditions ne sont pas nombreuses - en particulier lorsqu'il ne s'agit que d'une seule condition, - la déclaration IF est le choix parfait pour ce que vous essayez de faire, comme cela a également été mentionné.
Néanmoins, selon votre scénario, une expression CASE peut toujours être utilisée, mais pas exactement comme vous l'avez montré. En particulier, s'il existe de nombreuses conditions à vérifier dans lesquelles une correspondance doit entraîner le même ensemble d'actions (par exemple, lever une exception et terminer le script), vous pouvez utiliser une expression CASE dans une instruction d'affectation stockant le résultat de CASE, puis suivez avec un IF vérifiant le résultat stocké et effectuant les actions requises, le cas échéant, comme ceci:
DECLARE @ErrorMessage varchar(1000);
SET @ErrorMessage =
CASE WHEN @dateA = @dateB THEN
'Dates equal'
CASE WHEN ... /* some other condition */ THEN
'Some other message'
.
.
.
ELSE
'' -- no message if nothing is wrong;
-- you can also omit the ELSE branch entirely,
-- which means the same as ELSE NULL
END
;
IF @ErrorMessage <> ''
BEGIN
RAISERROR (@ErrorMessage, 20, -1) WITH LOG;
END;
... /* continue the script */
Dans ce cas, l'action requise déclenche une exception, mais le message renvoyé avec l'exception doit dépendre de la condition vérifiée en premier. L'instruction d'affectation utilise une expression CASE pour choisir le message à stocker dans la @ErrorMessage
variable.
Vous pouvez également voir que l'erreur n'est déclenchée que de manière conditionnelle - uniquement si la variable contient réellement un message à afficher. Si la valeur est une chaîne vide ou une valeur nulle, le script continuera simplement sans interruption.
CASE
- SQL Server n'a que l'CASE
expression.