Je suis nouveau sur SQL Server et c'est mon premier message.
Je reçois le message "Syntaxe incorrecte près de" = "lors de l'utilisation de l'instruction CASE. Voici un exemple de mon code:
Select * , CASE when a > b THEN b = a when c > d THEN d = c when e > f THEN f = e when g > h THEN h = g when i > j THEN j = i when k > l THEN l = k when m > n THEN n = m when o > p THEN p = o END as value INTO #temptable From #atemptable
3 Réponses :
Ce n'est pas clair si vous voulez que le puis code> une apparcription ou une comparaison. De toute façon, ce n'est pas possible, la partie
code> ne peut être qu'une expression. Je suppose que vous vouliez une mission. Il semble que vous ne voulez pas mettre à jour le
#atestable code>, vous voulez juste que les nouvelles valeurs dans
#temptable code>. Dans ce cas, vous pouvez utiliser des expressions code> distinctes CODE>, comme ceci:
SELECT A, CASE WHEN A > B THEN A ELSE B END AS B,
C, CASE WHEN C > D THEN C ELSE D END AS D
END AS value
INTO #temptable
FROM #atemptable
Pedantic Plongez dans la documentation: une comparaison, par exemple PI> = E CODE>, est un Expression avec un type de données de résultat de
Boolean code>
. Comme la documentation indique: "Contrairement à d'autres types de données SQL Server, un type de données code> Boolean code> ne peut pas être spécifié comme type de données d'une colonne de table ou d'une variable, et ne peut pas être retourné dans un ensemble de résultats." ...
... Pour compléter le cycle de la documentation pour case code>
offre:" Expression de résultat i> est une expression valide. " Ainsi, une expression de résultat code> peut être une comparaison sur l'égalité, mais il ne peut pas être renvoyé que le type de données booléen code> ne peut pas être renvoyé, mais c'est une "expression valide", mais non valide dans ce contexte. Où est le "tirant des cheveux" Emoji?
Eh bien, il semblerait que Sélectionnez 1 dans la cas où 1 = 1 = 1 = 0 autre 1 = 1 extrémité code> devrait fonctionner, mais ce n'est pas le cas. 😕
Il serait presque i> sembler comme ça. Le problème est que "un type de données booléen ne peut pas être spécifié comme type de données d'une colonne de table ou d'une variable et ne peut pas être renvoyé dans un ensemble de résultats". Si cela pourrait alors SELECT 1> 0; CODE> fonctionnerait car un Sélectionner la liste peut contenir une expression. Puisque vous pouvez créer des expressions
boolean code>, mais ne peut jamais contenir sur une valeur
boolean code>, il fait que la documentation sonne comme un argument sur ce que "est".
Dans mon commentaire précédent, je n'ai pas essayé de i> Retour i> A expression boolean code>, j'essayais de l'utiliser dans le
où code> condition.
A où code> clause Expression de recherche
... en cas de fin de compte; code> ne serait pas valide. Essayer de votre déclaration entraîne toujours une erreur dans la clause
(code> puisque code> depuis la valeur de retour de l'affaire
code> expression ne peut pas être un
booléen code>, un problème Que mon deuxième commentaire ne donne pas clair en citant l'évangile selon Microsoft. (J'ai maintenant une calvitie Microsoft Motif.)
@Habo, merci à vous deux pour vos commentaires. Je travaille toujours sur cette question et fournira une mise à jour bientôt.
Non seulement vous avez besoin d'une instruction de mise à jour comme TT a écrit dans les commentaires, vous ne pouvez pas également utiliser des expressions de cas comme contrôle de flux.
Une expression de cas renvoie une valeur basée sur la condition (s). Une opération à l'intérieur du Vous recherchez probablement quelque chose comme ceci: P> puis code> une partie d'une expression de cas n'est valide que lorsqu'elle renvoie une valeur. P>
UPDATE #temptable
SET B = CASE A > B Than A ELSE B END
,D = IIF(C > D, C, D) -- IIF is syntactic sugar for simple case expressions
-- more of the same for all other columns
Merci pour votre avis. Je travaille toujours pour résoudre ce problème. Je vais fournir une mise à jour une fois que tout est résolu.
Vous devez connaître une note importante sur l'affaire code> code> dans T-SQL:
L'expression de cas évalue ses conditions séquentiellement et s'arrête avec la première condition dont la condition est satisfaite p> blockQuote>
En savoir plus ici: https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql?view=SQL-SERVER-2017 a> p>
Donc, basé sur la pointe susmentionnée, vous
case code> ne sera pas exécuté comme prévu, car si nous supposons que votre première condition (A> B) est vraie, Ensuite, l'évaluation de
case code> sera arrêtée et vous n'obtiendrez pas les autres résultats des conditions. P>
Pour résoudre celui-ci, vous devez écrire un cas code> déclaration code> chacune vos conditions comme ci-dessous: p>
xxx pré>
update strong> p> Comme vous l'avez mentionné dans votre commentaire: P>
J'essaie d'évaluer une expression où il vérifie si une variable est supérieure à celle de l'autre. S'il est ensuite défini, la variable inférieure égale à la plus grande variable p> blockquote>
Donc l'histoire comme totalement différente et vous devez utiliser une approche comme celle-ci: p>
Supposons que nous disposions d'un ensemble de variables définies comme ci-dessous: en savoir plus sur la définition variable dans T -SQL: https://docs.microsoft.com/en-us/sql/t-sql/language-elements/declare-local-variable-transact-sql?view=SQL-SERVER-2017 a> p>
xxx pré> pour évaluer votre scénario, nous devons écrire le code comme ci-dessous: p>
xxx pré> donc si nous exécutons le Sélectionnez, nous verrons le résultat: p>
xxx pré> p>
Merci pour votre avis. Je travaille toujours sur cette question et déterminera si ce que vous avez présenté fonctionnera. Je vous tiendrai au courant.
Bonjour Msab2, pouvez-vous d'abord expliquer ce que vous essayez de faire?
J'essaie d'évaluer une expression où il vérifie si une variable est supérieure à celle de l'autre. S'il est alors défini, la variable inférieure égale à la plus grande variable. Avoir un sens? Est-ce que cela répond à votre question? Il s'agit du code existant dans une autre langue (SAS) que j'essaie de refaire dans SQL.
Heh, je peux lire ce genre de, mais vous ne pouvez pas le faire dans une déclaration de sélection. Il n'existe que pour sélectionner des choses. Pas d'attribution ou de chose possible, c'est ce que vous avez la déclaration de mise à jour.
D'accord. Merci tt. Je vais examiner la déclaration de mise à jour.