2009-11-19 24 views
4

Étant donné:Est-ce que toutes les parties d'une expression SQL SERVER utilisant 'OU' sont évaluées?

WHERE (@Id Is NULL OR @Id = Table.Id) 

Si @Id est nulle: l'expression est évaluée à true. La deuxième partie @Id = Table.Id est-elle toujours prise en compte? ou est-ce suffisant que l'expression évalue à vrai étant donné que la première partie est (ce qui est le cas dans C#). Ceci est pertinent en raison de certaines instructions OR beaucoup plus complexes où il est important de savoir si toutes les parties sont évaluées.


MISE À JOUR:

J'ai depuis trouvé cette syntaxe pour être une bonne alternative

WHERE (Table.Id = ISNULL(@Id, Table.Id)) 
+0

Dans les requêtes complexes les deux parties pourraient être exécutés en parallèle ... – tster

Répondre

9

Parfois, ils le sont, parfois ils ne le sont pas. SQL Server ne garantit pas le court-circuit de l'opérateur booléen, ne comptez pas sur lui pour l'exactitude. Voir cet article de blog: Boolean Operator Short Circuit.

Les requêtes complexes qui dépendent de @variables comme celui-ci sont beaucoup mieux écrits comme explicites instructions IF:

IF (@id IS NULL) 
    SELECT ... FROM ... WHERE ... 
ELSE 
    SELECT ... FROM ... WHERE ... 
+0

super article dans le blog – CRice

1

plans d'exécution peuvent ne pas être si grande avec une requête comme ça. Les deux seront évalués.

+0

J'ai couru l'exemple du blog Remus posté, "sélectionnez" ne divise pas par zéro! où (@id est NULL ou 1/0 = 0) "n'a pas causé d'erreur quand @id est NULL – CRice