Bir argüman olarak bir veritabanı adı alır ve bu veritabanının dizinleri ve parçalanma düzeyi bir tablo döndüren bir saklı yordam yazıyorum. Bu saklı yordam DBA veritabanımızda (DBA'ların bir şeyleri izlemek ve optimize etmek için kullandığı tabloları içeren DB) yaşayacaktır. Bir fark yaratırsa söz konusu sistemlerin tümü SQL Server 2008 R2'dir.
Ben temel sorgu çalıştı, ama dizinlerin gerçek isimlerini sağlamaya çalışırken takılıyorum. Bildiğim kadarıyla, bu bilgi her bireyin sys.indexes görünümünde bulunur. Benim özel sorun, bu görünümü başka bir veritabanının saklı yordamından programsal olarak başvurmaya çalışıyor.
Açıklamak gerekirse, bu sorgunun söz konusu kısmıdır:
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
Uygun sys.indexes görünümünü kullandığından, sorgu @db_id tarafından tanımlanan veritabanından yürütüldüğünde iyi çalışır. Eğer bunu DBA veritabanından çağırmaya çalışırsam, sys.indexes görünümü yanlış veritabanı için olduğu gibi, hepsi boş kalır.
Daha genel anlamda, böyle bir şey yapabilmem gerekiyor:
DECLARE @db_name NVARCHAR(255) = 'my_database';
SELECT * FROM @db_name + '.sys.indexes';
veya
USE @db_name;
Dize birleştirme ve OBJECT_NAME / OBJECT_ID / DB_ID işlevlerinin birleşimlerini kullanarak veritabanlarını değiştirmeyi veya diğer veritabanlarına başvurmayı denedim ve hiçbir şey işe yaramıyor. Topluluğun sahip olabileceği fikirleri takdir ediyorum, ancak her bir veritabanında yer almak için bu saklı yordamı yeniden düzeltmek zorunda kalacağından şüpheleniyorum.
Önerileriniz için şimdiden teşekkür ederiz.