【问题标题】:T-SQL Old style joins *= and =*T-SQL 旧式连接 *= 和 =*
【发布时间】:2011-07-15 23:42:10
【问题描述】:

我们有大约 150 个使用 *= 和 =* 类型 ANSI92 的旧式查询和视图?加入。 有没有人知道可以帮助转换的工具/方法或脚本,或者我们是否必须通过所有 150 个。

谢谢

Select  PapersSent,
DateSent,
Code,
ActionDate,
ClientAction,
ClientContactRef,
PublishAppraisal,
PublishCV,
SponsorContactREF,
MeetingNotes,
InternalNotes,
Contact_AdminAction,
MeetingLocation
from    tblMeetingNotes a,
    tblPapersOptions b,
    tblContactLog c 

where   a.CREF=@CREF and 
    a.CLID=@CLID AND 
    Isnull(PapersSent,0)*=Value AND
    a.CREF*=c.CREF AND
    a.CLID*=c.Contact_ID

【问题讨论】:

  • "ANSI92?join" *= 和 =* 不是 ANSI 92。ANSI SQL 92 引入了冗长的连接语法,例如 inner joinleft outer join
  • 有什么特殊原因需要转换它们吗?为什么不让它们保持原样?
  • @Ben - 该语法已弃用,根据此答案doesn't always return the correct results
  • @Ben - SQL Server 2000 中联机丛书的直接引用“在早期版本的 Microsoft® SQL Server™ 2000 中,左外连接条件和右外连接条件是使用 = 在 WHERE 子句中指定的和 = 运算符。在某些情况下,这种语法会导致不明确的查询,可以用多种方式解释。这意味着这些连接永远不应该被使用,甚至早在十一年前也不应该被使用,因为它不能保证按规定执行。如果您有任何此代码,则需要修复它。
  • “在某些情况下”。如果你没有这些情况,你就没有问题。 Deprecated 的意思是“不再制造”,而不是“扔掉旧的”。从那时起,操作员的解释就没有改变。我不建议任何人仅​​仅因为它已被弃用而更改经过调试、经过实战测试的代码。

标签: sql tsql sql-server-2000


【解决方案1】:

这可能不是您希望听到的,但这种工具并不存在。在某些情况下,旧样式的 JOIN 无法完全转换为 SQL-92 样式,导致查询给出不同的结果,甚至需要重写查询。

即使有一个工具可以自动转换连接,您仍然需要测试每个查询以确保它转换成您想要的方式,创建的工作量可能与通过以下方式完成的工作量一样多手。

Erland Sommarskog 有一个关于如何将旧式联接快速转换为 SQL-92 的良好分步流程:http://www.sommarskog.se/Become-an-ANSI-star.doc

【讨论】:

    【解决方案2】:

    在您转换之前,我肯定会了解设置某种测试框架,以便您可以比较结果。

    如果所有这些都是视图,或者您可以将输出放入表中,这将是最简单的。

    此时您可以使用 EXCEPT 之类的方法来确保所有行都匹配。

    过去,我使用存储过程编写生成表比较的代码,这些过程获取表/视图并生成比较。甚至包括金额差异的数字/百分比阈值,其中一组存在令人尴尬的舍入问题 - 例如银行家舍入 (Teradata) 或 IEEE 基于浮点的舍入 (WebFocus)。

    【讨论】:

      【解决方案3】:

      您可以编写数据库脚本并使用搜索和替换来更改其中的大部分内容并手动检查更困难的情况。如 mfredrickson 所指出的,请务必彻底测试所有查询,以防输出发生变化。

      为了帮助搜索,尽管如果您编写数据库脚本并非绝对必要,请下载Redgate's SQL Search(它是免费的)以帮助您找到所有实例。即使您不将它用于此任务,它也很方便。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多