一尘不染

检查索引碎片时'('附近的语法不正确

sql

我正在尝试使用SQL 2008 R2检查数据库中的索引碎片。

我正在使用以下代码,该代码取自http://msdn.microsoft.com/zh-
cn/library/ms189858(v=sql.100).aspx,并进行了一些名称更改:

USE StockSystem;
GO
SELECT a.index_id, name, avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats (DB_ID(), OBJECT_ID(N'dbo.StockItems'),NULL, NULL, NULL) AS a
JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id;

当我运行它时,我得到了错误:

Msg 102, Level 15, State 1, Line 2
Incorrect syntax near '('.

谁能发现我要去哪里错了?

更新

奇怪的是,如果我调用两个函数(DB_ID和OBJECT_ID)并获取值,然后将其替换为主选择语句中的值,则一切正常。根据MSDN,为什么我似乎不能在SELECT中使用这两个功能?

更新

为了响应Akrem的建议,我也尝试了此操作,但得到了相同的错误。

USE StockSystem;
GO
SELECT a.index_id, name, avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats (DB_ID('StockSystem'), OBJECT_ID(N'dbo.StockItems'), NULL, NULL, NULL) AS a
JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id;

更新

对不起,所有更新。我在带有数据库副本的SQL2012系统上尝试了相同的查询。这没有问题。我还尝试了相同的语句,但在不同的数据库上但在相同的SQL实例上使用了不同的名称。这也可以。

我想这是数据库的问题,所以我已将副本还原到测试SQL实例中。为该恢复的副本运行索引统计信息存在相同的问题。因为这是公司无法没有的生产数据库,所以我只能尝试其他方法。

有任何想法吗?

更新

好,这很奇怪。如果我从语句中删除DB_ID和OBJECT_ID,则批处理运行良好。

use StockSystem

declare @dbid SMALLINT
declare @objectid INT

select @dbid = DB_ID('StockSystem'), @objectid = OBJECT_ID(N'dbo.StockItems')

SELECT a.index_id,name,avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats (@dbid,@objectid,NULL,NULL,NULL) AS a
JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id;

阅读 147

收藏
2021-05-23

共1个答案

一尘不染

您的数据库可能已设置为兼容级别80(SQL Server 2000),并且DB_ID和OBJECT_ID函数不能用作动态管理功能的参数。

您应该将兼容性级别更改为较新的级别,或者在查询之前使用变量:

USE StockSystem;
GO
DECLARE
    @database_id INT = DB_ID(),
    @object_id   INT = OBJECT_ID(N'dbo.StockItems');

SELECT a.index_id, name, avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats (@database_id ,@object_id , NULL, NULL, NULL) AS a
JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id;
2021-05-23