J'essaie de configurer une requête, afin qu'elle compare deux dates de deux tables différentes, et si elles sont égales, la requête se termine. S'ils ne sont pas égaux, la requête se poursuit et insère des éléments. Je n'arrive pas à comprendre comment le faire faire ce que je veux cependant.
SELECT TOP(1) @dateA=a.someDate
FROM a
ORDER BY DESC;
SELECT TOP(1) @dateB=b.someDate
FROM b
ORDER BY DESC;
CASE WHEN @dateA=@dateB THEN raiseerror('dates equal',20,-1) with log;
Insert statements;
Toute aide serait super appréciée.
sql-server
t-sql
thejoker34
la source
la source
CASE
- SQL Server n'a que l'CASE
expression.Réponses:
CASE
est une expression (pas une instruction) et ne peut pas être utilisée pour le contrôle de flux comme ça - ne pas appeler de commandes, ne pas retourner plus d'une colonne / valeur, ne pas être utilisée comme une commande seule.Il me semble que vous pouvez simplement utiliser
IF
pour augmenter l'erreur lorsque les dates sont égales, sinon exécutez les insertions.Vous pouvez également le faire dans l'autre sens. Exécutez les insertions uniquement si les dates ne sont pas égales , sinon déclenchez l'erreur:
Si vous pensiez utiliser l'erreur uniquement dans le but de ne plus exécuter les insertions, vous pouvez simplement supprimer tout de
ELSE
bas, car la seule façon dont les insertions s'exécuteront est quand@dateA
et ne@dateB
sont pas égales :J'ai rétrogradé en étant pédant sur des choses comme les lignes (vs "enregistrements") et les colonnes (vs "champs"), mais l'expression entière vs chose instruction est une distinction très importante, pour exactement cette raison. Voir « Secrets sales de l'expression CASE ».
la source
NULL
. C'est toujours une bonne observation que les deux versions fournies par Aaron feront des choses différentes dans ce cas.Utilisez un
IF
au lieu d'unCASE
Cela suppose bien sûr que vous souhaitiez réellement générer une erreur. L'autre option serait:
Maintenant, notez le
BEGIN
et leEND
. Cela va être important. l'IF
instruction (et laELSE
) affecte uniquement la commande juste en dessous. Si vous avez besoin de plusieurs commandes, vous avez besoin d' un BEGIN et d'une END .la source
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:
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.
la source
Avez-vous besoin des variables?
la source