【问题标题】:Moving from SQL Server 2008 to SQL Server 2012 Express从 SQL Server 2008 迁移到 SQL Server 2012 Express
【发布时间】:2012-05-21 23:58:13
【问题描述】:

我正在将应用程序从 SQL Server 2008 迁移到 SQL Server 2012 Express,一切正常,但有几个存储过程说我有语法错误。我在网上查看并没有找到答案 - SQL Server 2008(标准)中是否支持但 SQL Server 2012 Express 中不支持的语法类型?

【问题讨论】:

  • 我想不到。也许您可以展示一个示例和 ACTUAL 错误消息。这里有一些聪明人,但读心术的人很少。
  • 对不起,我知道这很模糊,但错误无处不在。一些语法,一些说对象不存在,等等。我以前没有使用过 MS 产品,但我认为这可能类似于从 perl4 到 perl5,或从 php 4 到 php5,其中某些事情会中断并且存在转换在那里指导。我不知道是不是这样,我还没有找到一个,但我怀疑类似的事情可能是答案。我将添加一些实际的错误消息。谢谢。

标签: sql sql-server-2008 sql-server-2012-express


【解决方案1】:

我想有一种可能性,如果在 2008 年您使用的是 2000 兼容模式,并且您的存储过程具有旧式外连接:

SELECT o.name, c.name
FROM sys.objects AS o, sys.columns AS c
WHERE o.[object_id] *= c.[object_id];

此语法在 SQL Server 2000 中有效,但此后已被弃用。在 2005、2008 和 2008 R2 中,如果您使用 80 兼容模式,您可以将其插入。从 SQL Server 2012 开始,您不能再使用 80 兼容模式,因此上述代码将失败并显示:

消息 102,级别 15,状态 1,第 3 行
“*=”附近的语法不正确。

在 2008 年,您会收到以下错误消息:

消息 4147,级别 15,状态 1,第 3 行
查询使用非 ANSI 外连接 运营商 ("*=" or "=*")。要在不修改的情况下运行此查询, 请将当前数据库的兼容级别设置为 80,使用 ALTER DATABASE 的 SET COMPATIBILITY_LEVEL 选项。它是强烈的 建议使用 ANSI 外连接运算符重写查询(左 外连接,右外连接)。在 SQL Server 的未来版本中, 即使在 向后兼容模式。

但是,如果您按照错误消息中的建议更改数据库,它将起作用:

ALTER DATABASE foo SET COMPATIBILITY_LEVEL = 80;

这似乎有点牵强。但是没有一些真实的信息,这是我唯一的猜测。

【讨论】:

  • “'*=' 附近的语法不正确”是我收到的消息之一。它以前是一个 2000 版兼容的数据库。我从未见过这种语法。进行转换或了解需要转换的内容的最佳方法是什么?
  • @zortacon:错误信息说明了一切:It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN).
【解决方案2】:

这是 SQL Server 2012 中已弃用功能的list - 请特别查看 T-SQL 部分。您还可以使用 SSDT (SQL Server Data Tools),创建数据库的脱机副本,然后将版本定位设置为 SQL Server 2012 - 输出将显示版本之间的许多语法不兼容。我写了一篇关于 SSDT 的博客,可能会有所帮助 here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    相关资源
    最近更新 更多