मैं एक संग्रहीत प्रक्रिया लिख रहा हूं जो एक डेटाबेस नाम को एक तर्क के रूप में लेता है और उस डेटाबेस के अनुक्रमित और उनके विखंडन स्तर की एक तालिका लौटाता है। यह संग्रहीत कार्यविधि हमारे डीबीए डेटाबेस (डीबी जिसमें टेबल डीबीए का उपयोग निगरानी और अनुकूलन के लिए होती है) में होगी। विचाराधीन सिस्टम सभी 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 दृश्य का उपयोग कर रही है। अगर मैं इसे डीबीए डेटाबेस से कॉल करने का प्रयास करता हूं, हालांकि, यह सब शून्य हो जाता है, क्योंकि sys.indexes दृश्य गलत डेटाबेस के लिए है।
अधिक सामान्य शब्दों में, मुझे ऐसा कुछ करने में सक्षम होने की आवश्यकता है:
DECLARE @db_name NVARCHAR(255) = 'my_database';
SELECT * FROM @db_name + '.sys.indexes';
या
USE @db_name;
मैंने डेटाबेस या स्ट्रिंग डेटाबेस और OBJECT_NAME / OBJECT_ID / DB_ID कार्यों के संयोजन का उपयोग करके अन्य डेटाबेस को संदर्भित करने की कोशिश की है और कुछ भी काम नहीं कर रहा है। मैं किसी भी विचार की सराहना करता हूं जो समुदाय के पास हो सकता है, लेकिन मुझे संदेह है कि मुझे प्रत्येक व्यक्तिगत डेटाबेस में निवास करने के लिए इस संग्रहीत प्रक्रिया को फिर से करना होगा।
किसी सुझाव के लिए अग्रिम धन्यवाद।