我正在尝试使用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;
您的数据库可能已设置为兼容级别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;