我有一个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传递给我的Table-Valued函数并且没有找到任何东西。我已经尝试了CURRENT_TIMESTAMP的显式CAST / CONVERT,它不喜欢那里的任何函数。
在我的DB2上执行了什么巫术,它允许它运行尚未在DB1上执行的dbo.Function(Current_Timestamp)?我将继续自己检查,但是非常感谢人们可以发送的任何帮助。
答案 0 :(得分:4)
检查数据库的兼容级别(如果在DB1中发生问题或在DB1中调用该函数时,它没有100%清除。)
我敢打赌,无论数据库出现什么问题,兼容级别都是80; SQL Server 2000不允许函数以这种方式直接传递给UDF(如果compat级别为80,我们也会遇到调用某些动态管理函数的问题 - 请参阅this blog post and the comments)。从2000年备份或分离后,该数据库必须已经恢复或附加。或者从2000升级后,您可以通过这种方式检查当前的兼容性:
SELECT name, compatibility_level FROM sys.databases WHERE name = 'DB1';
如果你发现它是< 100,你可以说:
ALTER DATABASE DB1 SET COMPATIBILITY_LEVEL = 100;
但是,如果您知道由于某些其他原因不需要较低的兼容性,那么您应该这样做 - 并且您应该在测试系统上验证数据库在新的compat级别下按预期工作。如果您遇到问题,可以随时更改,但最好做好准备。
如果您不想弄乱兼容级别,可以略微更改逻辑。
DECLARE @now DATETIME = CURRENT_TIMESTAMP;
SELECT * FROM dbo.getAllStatusesForGridProjectsByMaximumDate(@now);