SQL Server 2008查询编辑器更改查询逻辑

时间:2011-06-28 15:06:09

标签: sql sql-server sql-server-2008 ssms

我在SQL Server 2008中手工编写了一个简单的SQL,如下所示;

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 个答案:

答案 0 :(得分:3)

我试图在查询设计器中复制它,结果略有不同。我打字的方式和你一样:

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中的查询。你有没有看到它对你的视图代码的作用?我讨厌它。我只是在其他地方编码并在完成后粘贴短信。

答案 1 :(得分:2)

声明

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'))

这与问题中使用的初始陈述相同。

有关详细信息,请参阅Operator Precedence (Transact-SQL)