Все части выражения SQL SERVER, использующие 'ИЛИ', оцениваются? - PullRequest
5 голосов
/ 19 ноября 2009

Дано:

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

Если @Id равно нулю: выражение оценивается как true. Вторая часть @Id = Table.Id все еще рассматривается? или достаточно того, что выражение оценивается как истинное, если первая часть (как в случае c #).

Это имеет отношение к некоторым более сложным операторам ИЛИ, где важно знать, все ли части оцениваются.


UPDATE:

С тех пор я нашел этот синтаксис хорошей альтернативой

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

Ответы [ 2 ]

10 голосов
/ 19 ноября 2009

Иногда они есть, иногда нет. SQL Server не гарантирует короткое замыкание логического оператора, не полагайтесь на его правильность. Смотрите эту запись в блоге: Короткое замыкание логического оператора .

Сложные запросы, которые зависят от таких переменных @, гораздо лучше записать в виде явных операторов IF:

IF (@id IS NULL)
  SELECT ... FROM ... WHERE ...
ELSE
  SELECT ... FROM ... WHERE ...
1 голос
/ 19 ноября 2009

Планы выполнения могут быть не такими хорошими с таким запросом. Оба будут оцениваться.

...