我正在编写一个存储过程,该过程使用数据库名称作为参数并返回该数据库的索引及其碎片级别的表。该存储过程将存在于我们的DBA数据库(该DB包含DBA用于监视和优化事物的表的数据库)中。如果有所不同,那么所讨论的系统都是SQL Server 2008 R2。
我已经解决了基本查询,但是一直试图提供索引的实际名称。据我所知,该信息包含在每个人的sys.indexes视图中。我的特定问题是尝试以编程方式从另一个数据库的存储过程中引用该视图。
为了说明这一点,这是有问题的查询的一部分:
FROM sys.dm_db_index_physical_stats(@db_id,NULL,NULL,NULL,NULL) p
INNER JOIN sys.indexes b ON p.[object_id] = b.[object_id]
AND p.index_id = b.index_id
AND b.index_id != 0
从@db_id标识的数据库执行查询时,查询工作正常,因为它使用了正确的sys.indexes视图。但是,如果我尝试从DBA数据库中调用它,则所有结果都将为null,因为sys.indexes视图用于错误的数据库。
一般而言,我需要能够执行以下操作:
DECLARE @db_name NVARCHAR(255) = 'my_database';
SELECT * FROM @db_name + '.sys.indexes';
要么
USE @db_name;
我尝试使用字符串连接和OBJECT_NAME / OBJECT_ID / DB_ID函数的组合切换数据库或引用其他数据库,但似乎没有任何效果。我会感激社区可能有的任何想法,但是怀疑我将不得不重新构建此存储过程以驻留在每个单独的数据库中。
在此先感谢您的任何建议。