Sql server 查询在某些数据库中有效,但在其他数据库中无效。似乎是处理嵌套函数的查询解析问题。知道为什么吗?

Sql server 查询在某些数据库中有效,但在其他数据库中无效。似乎是处理嵌套函数的查询解析问题。知道为什么吗?,sql-server,tsql,sql-server-2008,Sql Server,Tsql,Sql Server 2008,我有以下SQL Server 2008查询,它适用于除一个数据库外的所有数据库(50+)。此查询应仅依赖于系统级功能,因此应在任何SQL Server数据库上运行。我所有的数据库都在一台服务器上,因此这不是服务器问题,而是一个数据库实例问题 SELECT * FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) AS istats WHERE avg_fragmentation_in_percent > 2

我有以下SQL Server 2008查询,它适用于除一个数据库外的所有数据库(50+)。此查询应仅依赖于系统级功能,因此应在任何SQL Server数据库上运行。我所有的数据库都在一台服务器上,因此这不是服务器问题,而是一个数据库实例问题

SELECT *
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) AS istats
WHERE avg_fragmentation_in_percent > 20
我在有问题的数据库中得到以下错误

Msg 102,15级,状态1,第2行 “(”附近的语法不正确

以下两个查询工作正常

SELECT *
FROM sys.dm_db_index_physical_stats(72, NULL, NULL, NULL, NULL) AS istats           
WHERE avg_fragmentation_in_percent > 20


select DB_ID()
因此,仅在这一特定数据库中解析查询时,SQL Server似乎遇到了一个问题。有人知道这可能是什么原因吗?

请确保在所有数据库中都是相同的。我打赌此语法不起作用的数据库设置为小于100。您可以检查数据库的兼容性级别l通过以下查询:

ALTER DATABASE database_name SET COMPATIBILITY_LEVEL = x;
也就是说,这些数据库可能选择在较低的compat级别,升级它们可能不是最好的主意。要解决此问题,您还可以尝试:

DECLARE @DB INT = DB_ID();
SELECT * FROM sys.function...(@DB, ...);

检查问题数据库的兼容性级别。在使用以下命令将兼容性级别设置为SQL Server 2000后,我刚刚尝试了对数据库的查询

ALTER DATABASE Junk
SET COMPATIBILITY_LEVEL = 80

我也犯了同样的错误。

该走了@Aaron Bertrand,你又赢了我。+1不管怎样。别担心,我已经报答了。