- Si vous exécutez
SELECT -100/-100*10
le résultat est0
. - Si vous exécutez
SELECT (-100/-100)*10
le résultat est10
. - Si vous exécutez
SELECT -100/(-100*10)
le résultat est0
. - Si vous exécutez
SELECT 100/100*10
le résultat est10
.
BOL déclare:
Lorsque deux opérateurs dans une expression ont le même niveau de priorité d'opérateur, ils sont évalués de gauche à droite en fonction de leur position dans l'expression.
Et
Level Operators
1 ~ (Bitwise NOT)
2 * (Multiplication), / (Division), % (Modulus)
3 + (Positive), - (Negative), + (Addition), + (Concatenation), - (Subtraction), & (Bitwise AND), ^ (Bitwise Exclusive OR), | (Bitwise OR)
Est-ce que BOL a tort ou est-ce que je manque quelque chose? Il semble que cela -
jette la préséance (attendue).
-
semble provoquer un «mauvais» flux. Si vous essayez, -100/(-100)*10
vous obtenez le résultat 10
. il semble que le /
soit appliqué à la valeur -
de l'équation, puis l'équation 100*10
est en cours de détermination. Je ne suis pas sûr que ce soit une erreur avec BOL, mais plus que SQL Server ne se comporte pas comme prévu. Cela pourrait valoir la peine de soulever un problème sur sql-docs et de voir quelle est leur réponse; peut-être qu'une note pourrait être ajoutée à la documentation informant de la "fonctionnalité".
SELECT -100/(-100)*10
renvoie également 10. On dirait qu'il -
est traité comme l' -
opérateur qui ne devrait être appliqué qu'après le 100*10
calcul
A / -B * C
est A <div> <negate> B <multiply> C
. Negate a une priorité inférieure à multiplier, selon la documentation, le résultat est donc A / -(B * C)
. Vous pouvez le voir plus clairement en utilisant des constantes flottantes: 12e / -13e * 14e
vs 12e / (-13e) * 14e
vs. 12e / 13e * 14e
La raison pour laquelle cela nous dérange est que nous nous attendons généralement à ce que le moins unaire fasse partie du littéral, ou du moins ait une priorité très élevée, mais ce n'est pas ainsi que T-SQL travaux.