【问题标题】:SQL Server 2012 Linked Server bugSQL Server 2012 链接服务器错误
【发布时间】:2015-06-28 08:28:26
【问题描述】:

当我像这样从链接的 SQL Server 2012 运行选择时:

select A.*
from A, (select TOP 1 * from B) as B
where A.test in (B.col1, B.col2)

虽然 A 有很多行,但我只从 A 得到 1 行。 B 这里是参数表,只有 1 行。

这里的 A 和 B 是指向远程服务器上的表的同义词。

【问题讨论】:

  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(20 多年前),不鼓励使用它
  • 您的问题是什么?看来你已经有了答案。
  • @marc_s,在这种情况下,您的评论对问题没有意义。我尝试使用内部连接并得到相同的错误:)
  • @JamesZ - 我只是花时间处理这个错误并与其他人分享它的知识。
  • @marc_s 是正确的,要踢坏习惯。维护这种性质的 SQL 代码只是一场噩梦。尤其是当仍有一些人需要在一个坚实的平台上构建时。

标签: sql-server select sql-server-2012


【解决方案1】:

我们知道没有 ORDER BY 的 TOP 可能会产生不确定的结果,但是如果我们在表中只有 1 行,那一定是可以的。但是,MS SQL Server 2012 万一有问题,他的工作就很糟糕。为避免此类问题,您必须在嵌套表 (B) 中编写 ORDER BY!之后,查询给出正确的结果。所以,正确的查询必须是:

select A.*
from A, (select TOP 1 * from B ORDER BY <any field>) as B
where A.test in (B.col1, B.col2)

考虑到 SQL Server 在本地服务器的情况下表现良好,但在链接服务器的情况下工作方式不同。

【讨论】:

    【解决方案2】:

    在您给定的查询中,连接结构被认为是 交叉连接 ,所以通过在 在哪里 子句您正在有效地将连接条件更改为 内部联接 遵循这个连接结构。如果您使用 ANSI-92 SQL 标准,其他维护您的代码的人也会变得更好。

    考虑这样的查询:

    SELECT A.*
    FROM A
        INNER JOIN
        (
            SELECT col1 AS test FROM B
            UNION
            SELECT col2 AS test FROM B
        ) C 
        ON A.test = C.test
    

    【讨论】:

    • FROM A,B 是交叉联接而不是完全外部联接。
    • 感谢@MartinSmith.. 更正应用
    猜你喜欢
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 2014-04-16
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多