OU Opérateur court-circuit dans SQL Server
Je veux consulter SQL Server OU de court-circuit
Code:
DECLARE @tempTable table
(
id int
)
INSERT @tempTable(id) values(1)
DECLARE @id varchar(10)
SET @id = 'x'
SELECT * FROM @tempTable WHERE 1=1 OR id = @id --successfully
SELECT * FROM @tempTable WHERE @id = 'x' OR id = @id --Exception not Convert 'x' to int
Pourquoi? 1=1 et @id='x' est vrai.
SQL Server OU de l'opérateur : si le court-circuit de la fonction?
GRÂCE
source d'informationauteur NotTwoWayStreet | 2012-06-27
Vous devez vous connecter pour publier un commentaire.
Dans le SQL, il y est pas nécessaire qu'une clause de pauses tôt. En d'autres termes, c'est à l'optimiseur s'il faut vérifier les deux conditions simutaneously. Je ne suis pas un expert dans le MSSQL optimiseur, mais j'ai vu des cas où l'optimiseur a et n'a pas de court-circuit d'une OU de clause.
Viens de tombé sur cette question, et avait déjà trouvé ce blog-entrée: http://rusanu.com/2009/09/13/on-sql-server-boolean-operator-short-circuit/
SQL server est gratuit pour optimiser une requête partout où il le juge opportun, de sorte que dans l'exemple donné dans le billet de blog, vous ne pouvez pas compter sur de court-circuit.
Cependant, un CAS apparemment, est documentée à évaluer dans l'ordre écrit - vérifier les commentaires de ce billet de blog.
Mais il est évident que MS Sql server prend en charge de Court-circuit de la théorie, pour améliorer les performances en évitant inutile de vérifier,
Soutenir Exemple:
Ici, le premier exemple serait le résultat d'erreur "échec de la Conversion lors de la conversion de la valeur varchar" Un " type de données int.'
Tandis que le second s'exécute facilement que la condition 1 = 1 a été évalué à VRAI, et donc la deuxième condition n'a pas couru.
De plus
ici la première condition serait la valeur false et donc le SGBD pencherais pour la deuxième condition, et de nouveau, vous obtiendrez l'erreur de conversion, comme dans l'exemple ci-dessus.
NOTE: J'AI ÉCRIT À TORT L'ÉTAT JUSTE POUR RENDRE COMPTE DE LA MÉTÉO, LA CONDITION EST EXÉCUTÉE OU COURT-CIRCUITÉES
SI LES RÉSULTATS DE LA REQUÊTE EN ERREUR SIGNIFIE QUE LA CONDITION EXÉCUTÉ, A COURT-CIRCUITÉ LE CONTRAIRE.
EXPLICATION SIMPLE
Envisager,
comme la première condition est d'obtenir une évaluation de VRAIses sens pour évaluer la deuxième condition, parce que son évaluation, quelle que soit la valeur
n'aurait pas d'incidence sur le résultat, à tous, de sorte que sa bonne occasion pour Sql Server pour sauvegarder l'Exécution de la Requête du temps en sautant inutile condition de la vérification ou de l'évaluation.
en cas de "OU" si la première condition est évaluée à VRAI l'ensemble de la chaîne reliés par "OU" serait considérée comme vraie, sans évaluer d'autres.
si la condition1 est vraie, reste toutes les conditions jusqu'à conditionN sera sauté.
Dans généralisé des mots à la détermination du premier VRAI, toutes les autres conditions liées par OU ignorées.
Examiner la deuxième condition
comme la première condition est d'obtenir evalutated à FAUX son sens pour évaluer la deuxième condition, parce que son évaluation, quelle que soit la valeur
n'aurait pas d'incidence sur le résultat à tous, donc encore une fois sa bonne occasion pour Sql Server pour sauvegarder l'Exécution de la Requête du temps en sautant inutile condition de la vérification ou de l'évaluation.
en cas de "ET" si la première condition est évaluée à FAUX l'ensemble de la chaîne connecté avec le "ET" serait considéré comme évalué à FALSE, sans évaluer d'autres.
si la condition1 est évalué à FAUXreste toutes les conditions jusqu'à conditionN sera sauté.
Dans généralisé des mots à la détermination du premier FAUX, toutes les autres conditions liées par ET ignorées.
À CET EFFET, UN SAGE PROGRAMMEUR DOIT TOUJOURS PROGRAMME DE LA CHAÎNE DES CONDITIONS DE TELLE MANIÈRE QUE, MOINS CHER OU PLUS ÉLIMINANT LA CONDITION SE ÉVALUÉE EN PREMIER,
OU ORGANISER LA CONDITION DE TELLE FAÇON QUE L'ON PEUT TIRER UN PROFIT MAXIMAL DE COURT-CIRCUIT
Merci et Salutations,
Rk_Hirpara