SQL Server 2008 Query Editor изменяет логику запроса - PullRequest
8 голосов
/ 28 июня 2011

Я вручную написал простой SQL в SQL Server 2008, как показано ниже;

SELECT * FROM Tab1 WHERE A='1' AND (B='1' OR C='1');

Будучи ленивым, я открыл этот запрос в редакторе запросов, чтобы проверить синтаксис, и нажал OK в диалоговом окне без каких-либо изменений.

Я заметил, что редактор запросов изменил мой запрос на:

SELECT * FROM Tab1 WHERE A='1' AND (B='1') OR (C='1');

ясно, что это меняет логику SQL и возвращает разные результаты в зависимости от того, какой из них вы выполняете.

Я регулярно использую редактор запросов для проверки моего синтаксиса сложных запросов. Так что немного волнуюсь, что такое тонкое изменение может привести к неожиданностям, но изменит результат.

Это особенность дизайнера? Что я могу сделать, чтобы изменить это поведение?

РЕДАКТИРОВАТЬ: Спасибо за указание на то, что изменения, внесенные редактором, не совсем такие же, как указано выше, но все равно запрос изменен, хотя результаты совпадают. Спасибо

Ответы [ 2 ]

3 голосов
/ 28 июня 2011

Я попытался повторить это в Query Designer и получил немного другой результат.Я напечатал так же, как вы:

SELECT * FROM Tab1 WHERE A='1' AND (B='1' OR C='1');

И получил это:

SELECT     *
FROM         Tab1
WHERE     (A = '1') AND (B = '1') OR
                      (A = '1') AND (C = '1')

Я должен сказать, что результат тот же, но мы все можем видеть опасным дорога сюда.Также мне не понравилась репликация (A = '1').Черт возьми, мне нужен код, как я его кодировал!

Слово мудрому: я никогда не форматирую свои запросы в SQL Server Management Studio.Вы видели, что это делает с кодом вашего взгляда?Я ненавижу это.Я просто код где-то еще и вставляю в SMS, когда закончите.

2 голосов
/ 28 июня 2011

Оператор

SELECT * FROM Tab1 WHERE A='1' AND (B='1' OR C='1')

разрешает мне:

SELECT * FROM Tab1 WHERE (A='1') AND (B='1') OR (A='1') AND (C='1')

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

SELECT * FROM Tab1 WHERE ((A='1') AND (B='1')) OR ((A='1') AND (C='1'))

И это то же самое, что и первоначальный оператор, используемый ввопрос.

Подробнее см. Приоритет оператора (Transact-SQL) .

...