Tôi đang viết một thủ tục được lưu trữ lấy tên cơ sở dữ liệu làm đối số và trả về một bảng các chỉ mục của cơ sở dữ liệu đó và mức độ phân mảnh của chúng. Quy trình được lưu trữ này sẽ sống trong cơ sở dữ liệu DBA của chúng tôi (DB chứa các bảng mà các DBA sử dụng để theo dõi và tối ưu hóa mọi thứ). Các hệ thống được đề cập là tất cả SQL Server 2008 R2 nếu điều đó tạo ra sự khác biệt.
Tôi có một truy vấn cơ bản được thực hiện, nhưng bị mắc kẹt khi cố gắng cung cấp tên thật của các chỉ mục. Theo hiểu biết tốt nhất của tôi, thông tin đó được chứa trong chế độ xem sys.indexes của mỗi cá nhân. Vấn đề cụ thể của tôi là cố gắng tham chiếu chế độ xem đó theo chương trình từ thủ tục lưu trữ của cơ sở dữ liệu khác.
Để minh họa, đây là một phần của truy vấn có vấn đề:
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
Truy vấn hoạt động tốt khi được thực thi từ cơ sở dữ liệu được xác định bởi @db_id, bởi vì nó đang sử dụng chế độ xem sys.indexes thích hợp. Tuy nhiên, nếu tôi cố gắng gọi điều này từ cơ sở dữ liệu DBA, tất cả sẽ xuất hiện không, vì chế độ xem sys.indexes dành cho cơ sở dữ liệu sai.
Nói một cách tổng quát hơn, tôi cần có khả năng làm một việc như thế này:
DECLARE @db_name NVARCHAR(255) = 'my_database';
SELECT * FROM @db_name + '.sys.indexes';
hoặc là
USE @db_name;
Tôi đã thử chuyển đổi cơ sở dữ liệu hoặc tham chiếu các cơ sở dữ liệu khác bằng cách sử dụng kết hợp các hàm nối chuỗi và các hàm OBJECT_NAME / OBJECT_ID / DB_ID và dường như không có gì hoạt động. Tôi đánh giá cao bất kỳ ý tưởng nào mà cộng đồng có thể có, nhưng nghi ngờ tôi sẽ phải kiểm tra lại quy trình được lưu trữ này để cư trú trong mỗi cơ sở dữ liệu riêng lẻ.
Cảm ơn trước cho các đề nghị.