【问题标题】:SQL Server 2008 Query Editor changes the query logicSQL Server 2008 查询编辑器更改查询逻辑
【发布时间】:2011-06-28 15:06:09
【问题描述】:

我在 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 的逻辑并根据您执行的结果返回不同的结果。

我经常使用查询编辑器来验证我对复杂查询的语法。所以有点担心这样的细微变化会被忽视,但会改变结果。

这是设计师的特色吗?我可以做些什么来改变这种行为吗?

编辑:感谢您指出编辑器所做的更改与上面的不太一样,但查询仍然被修改,尽管结果相同。

谢谢

【问题讨论】:

  • 伙计,如果它不断变化的查询,这是一个可怕的想法!
  • 做了检查,我正确地解决了:SELECT * FROM Tab1 WHERE (A='1' AND B='1') OR (A='1' AND C='1 ');.使用 2008 版测试,因此它可能取决于其他内容。
  • "在对话框中按下 OK "当我进行语法检查时,我没有得到任何 "OK"。
  • 等等,你是 SQL Management Studio 吗?
  • 我强烈建议不要在 Management Studio 中使用查询设计器或查询编辑器——它们充满了错误并且缺乏一些基本的 T-SQL 功能。一个类似的 bug 已经开放了将近 6 年:connect.microsoft.com/SQLServer/feedback/details/124819/…

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


【解决方案1】:

我尝试在查询设计器中复制它,结果略有不同。我输入的和你一样:

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。

【讨论】:

  • 是的,Adrian 和 MicSim 都是正确的。我想我有点惊慌失措,因为正如你指出的那样,我的括号弄乱了新的重复条件。不过会小心的。
【解决方案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-operator 在OR-operator 之前被评估:

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

这与问题中使用的初始语句相同。

详情请见Operator Precedence (Transact-SQL)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多