关键字“current_timestamp”附近的语法不正确 - 但仅在一个数据库上
Posted
技术标签:
【中文标题】关键字“current_timestamp”附近的语法不正确 - 但仅在一个数据库上【英文标题】:Incorrect syntax near the keyword 'current_timestamp' - But only on one Database 【发布时间】:2012-02-16 20:39:34 【问题描述】:我有一个 SQL Server 2008 R2 实例,上面有多个数据库。
我正在尝试在其中一个数据库(我们称之为 DB1)上运行表值函数,该函数将日期作为输入并返回相关信息表。
我这样运行我的查询:
SELECT * FROM dbo.getAllStatusesForGridProjectsByMaximumDate(CURRENT_TIMESTAMP)
获取最新信息。然而,SQL 只是踢出错误,而不是结果表:
Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'CURRENT_TIMESTAMP'.
但奇怪的是,如果我跳到另一个数据库 (DB2) 并在专门引用服务器的同时运行该函数,它会运行:
USE DB2
GO
SELECT * FROM DB1.dbo.getAllStatusesForGridProjectsByMaximumDate(CURRENT_TIMESTAMP)
返回结果。但是,如果我尝试从 DB1 运行查询,它会返回同样的语法错误:
USE DB1
GO
SELECT * FROM DB1.dbo.getAllStatusesForGridProjectsByMaximumDate(CURRENT_TIMESTAMP)
Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'CURRENT_TIMESTAMP'.
我查看了数据库,看看是否有一些我错过的设置或属性允许我将 CURRENT_TIMESTAMP 传递给我的表值函数,但没有找到任何东西。我尝试了 CURRENT_TIMESTAMP 的显式 CAST/CONVERT,但它不喜欢其中的任何函数。
在我的 DB2 上执行了哪些巫术,使其能够运行尚未在 DB1 上执行的 dbo.Function(Current_Timestamp)?我将继续自己检查,但如果您能提供任何帮助,我们将不胜感激。
【问题讨论】:
【参考方案1】:检查数据库的兼容性级别(问题是在 DB1 中发生还是在 DB1 中调用函数时发生,并不能 100% 明确)。
我敢打赌,在任何出现问题的数据库中,兼容性级别都是 80; SQL Server 2000 不允许以这种方式将函数直接传递给 UDF(如果兼容级别为 80,我们在调用某些动态管理函数时也会遇到同样的问题 - 请参阅 this blog post and the comments)。此数据库必须在从 2000 备份或分离后恢复或附加。或从 2000 升级后。您可以通过以下方式检查当前兼容性:
SELECT name, compatibility_level FROM sys.databases WHERE name = 'DB1';
如果你发现它是
ALTER DATABASE DB1 SET COMPATIBILITY_LEVEL = 100;
但只有在您知道由于其他原因不需要较低的兼容性时才应该这样做 - 并且您应该在测试系统上验证数据库在新的兼容级别下按预期工作。如果遇到问题,可以随时改回来,但最好做好准备。
如果你不想弄乱兼容级别,你可以稍微改变你的逻辑。
DECLARE @now DATETIME = CURRENT_TIMESTAMP;
SELECT * FROM dbo.getAllStatusesForGridProjectsByMaximumDate(@now);
【讨论】:
那么...呃...我们现在可以成为最好的朋友了吗? 当然。或者,当您看到其他人在同样的问题上苦苦挣扎时,只需支付它。 :-) 说真的,我有点被投入到 DBA 的角色中(小公司,你们都听说过这个故事),所以当其他事情中断时,我必须学习所有这些东西。兼容性级别正是我所需要的,因为 DB1 为 80,DB2 为 90。我将更多地研究兼容性级别,以便我了解我刚刚所做的,所以非常非常非常感谢您的输入。以上是关于关键字“current_timestamp”附近的语法不正确 - 但仅在一个数据库上的主要内容,如果未能解决你的问题,请参考以下文章