データベース名を引数として取り、そのデータベースのインデックスとその断片化レベルのテーブルを返すストアドプロシージャを書いています。このストアドプロシージャは、DBAデータベース(DBAが監視および最適化に使用するテーブルを含むDB)に存在します。問題のシステムはすべて、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
クエリは、適切なsys.indexesビューを使用しているため、@ db_idで識別されるデータベースから実行すると正常に機能します。ただし、これをDBAデータベースから呼び出そうとすると、sys.indexesビューが間違ったデータベース用であるため、すべてnullになります。
より一般的に言えば、私は次のようなことができるようにする必要があります:
DECLARE @db_name NVARCHAR(255) = 'my_database';
SELECT * FROM @db_name + '.sys.indexes';
または
USE @db_name;
文字列連結とOBJECT_NAME / OBJECT_ID / DB_ID関数の組み合わせを使用して、データベースの切り替えや他のデータベースの参照を試みましたが、何も機能しないようです。コミュニティのアイデアがあれば教えていただければ幸いですが、このストアドプロシージャを個別のデータベースに配置するために、ツールを変更する必要があると思います。
提案を事前に感謝します。