我正在尝试使用 SQL 2008 R2 检查数据库中的索引碎片。
我正在使用以下代码,取自http://msdn.microsoft.com/en-gb/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)并获取值,然后替换主 select 语句中的值,一切正常。根据 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;