我正在将一个应用程序从 SQL Server 2008 移动到 SQL Server 2012 Express,一切都很好,但有几个存储过程说我有语法错误。我在网上查看并没有找到答案 - SQL Server 2008(标准)中是否支持但在 SQL Server 2012 Express 中不支持的语法类型?
2 回答
我想有一种可能性,如果在 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 "=*"
)。要在不修改的情况下运行此查询,请使用 ALTER DATABASE 的 SET COMPATIBILITY_LEVEL 选项将当前数据库的兼容级别设置为 80。强烈建议使用 ANSI 外连接运算符(LEFT OUTER JOIN、RIGHT OUTER JOIN)重写查询。在 SQL Server 的未来版本中,即使在向后兼容模式下也不支持非 ANSI 连接运算符。
但是,如果您按照错误消息中的建议更改数据库,它将起作用:
ALTER DATABASE foo SET COMPATIBILITY_LEVEL = 80;
这似乎有点牵强。但是没有一些真实的信息,这是我唯一的猜测。
以下是SQL Server 2012 中已弃用的功能列表——请特别查看 T-SQL 部分。您还可以使用 SSDT (SQL Server Data Tools),创建数据库的脱机副本,然后将版本定位设置为 SQL Server 2012 - 输出将显示版本之间的许多语法不兼容。我写了一篇关于 SSDT 的博客,在这里可能会有所帮助。