3

Работает ли «OR» comparaison как vb. Я имею в виду, если он проверяет каждый или, если первый из них является ложнымЯвляется ли «OR» в SQL-коротком замыкании?

как

DECLARE @var1 bit; 
SET @var1=1 
DECLARE @var2 bit; 
SET @var2=1 

(@var1=1 or @var2=1) 
AND ... 

Итак, @var равно 1, нам не нужно, чтобы проверить var2, но SQL Server будет делать проверку ?

Его об оптимизации запроса (и памяти сервера)

танк вам

+2

http://dba.stackexchange.com/questions/5333/ логические операторы-и-в-условии-и-порядок-условия-в-где –

+2

VB 'Or' на самом деле ** не ** короткое замыкание и * будет * оценивать оба условных выражения. Сравните с 'OrElse' в VB. Единственный раз, когда коротко замыкающий (или не) * действительно * имеет значение * в терминах семантики *, - это когда побочные эффекты, включая Исключения, допускаются в условных выражениях, и это еще один вопрос: «Позволяет ли SQL Server побочные эффекты в условные?» –

+0

@pst: Хотя причина, по которой OP требует короткого замыкания, для производительности, которая является действительной причиной, связанной с побочным эффектом :) – mellamokb

ответ

0

От Microsoft Connect:

Спасибо за вашу обратную связь. Логические операторы, которые мы поддерживаем в SQL Server сегодня, это те, которые указаны в стандартах ANSI SQL и поддерживаются почти каждой системой баз данных. Мы не планируем распространять его для поддержки более нетрадиционных логических операторов. Если вы хотите условно вычислять выражения, то используйте выражение CASE, а не в SQL Server, как:

где случай когда то (выберите 1, где) когда то (выберите 2 где) ... конец = 1

Выражение CASE гарантирует, что предложения WHEN/THEN оцениваются по порядку.

2

По большей части, да, SQL Server использует короткое замыкание для операторов AND и OR, но иногда операции выполняются не в том порядке, который вы ожидаете. Это достаточно легко проверить с помощью следующих действий:

SELECT '"Divide By Zero" error' AS [test] WHERE (1/0 = 1) 

SELECT 'NO "Divide By Zero" error' AS [test] WHERE (1 = 1) OR (1/0 = 1) 

Вы можете найти более глубокий анализ здесь, Джанлука Сартори: http://www.sqlservercentral.com/articles/T-SQL/71950/