5

我正在尝试使用 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;
4

2 回答 2

17

您的数据库可能设置为兼容级别 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;
于 2013-04-08T11:57:30.510 回答
0

尝试添加数据库名称

DB_ID("DataBaseName")

更新 :

请试试这个并告诉它好像有效

USE StockSystem;
GO
select  * from sys.dm_db_index_physical_stats(DB_ID(),null,null,null,null)
于 2013-04-08T11:39:46.347 回答