脚本语法差异的原因

时间:2013-08-14 18:43:40

标签: sql sql-server-2008

修改

在第二行中我指出结果在语法上是不同的但在语义上是相同的。我的问题是 为什么 这可能是因为使用标准的SQL Server生成脚本。 以下是数据库的两个不同副本,我们在其中生成脚本。它们都来自同一个触发器。 同样,问题是为什么这可能是由于自动生成脚本造成的,或者这是不可能/不可能的问题,因此直接指向人工干预,即故意编辑触发器/脚本。 / p>

我最诚挚的道歉是不能更早地以更好的方式解释这个前提。

我正试图在客户端找出错误,我得到了他们的架构副本,触发了procs等。

在某些情况下,我发现语法差异会产生完全相同的结果 e.g。

BEGIN
    UPDATE cd_units
        SET shift_expired_status = 0
    FROM inserted
    WHERE inserted.shift_start >= dbo.get_dts()
        AND inserted.unid = cd_units.unid
END

VS

BEGIN
    UPDATE cd_units
        SET shift_expired_status = 0
FROM inserted
WHERE inserted.unid = cd_units.unid
    AND inserted.shift_start >= dbo.get_dts();
END

如您所见,最终结果相同,但在功能上相同。

这不应该,除非有人和我一起玩billy suggers,对吗?但这已经需要对此事进行更深入的调查。

2 个答案:

答案 0 :(得分:2)

Generate Scripts命令仅复制存储在有关对象的元数据中的内容。如果他们得出不同的结果,那是因为对象是不同的。也许有人改变了它,因为他们对SQL Server如何根据子句的顺序进行优化有误解?我们无法知道它如何或为何发生变化;我们只知道SQL Server不会为您更改它。您需要询问负责维护数据库的人员,了解对象可能发生更改的原因。

答案 1 :(得分:1)

我很犹豫回答,因为我不确定我是否完全理解这个问题,但似乎你对这两个问题感到困惑。

除了空格差异(不以任何方式影响查询),这两个查询在语义上是相同的。唯一的区别是WHERE子句中条件的排序。条件本身是相同的,所以你会得到相同的结果。