यदि आपको कभी भी OBJECT_NAME()
. का उपयोग करने की आवश्यकता हो तो SQL सर्वर में किसी भिन्न डेटाबेस से किसी ऑब्जेक्ट का नाम प्राप्त करने के लिए कार्य करता है, यदि आप नहीं जानते कि यह कैसे काम करता है, तो आपको समस्याएँ हो सकती हैं।
आप शायद जानते हैं कि OBJECT_NAME()
एक object_id
स्वीकार करता है तर्क जो SQL सर्वर को बताता है कि किस ऑब्जेक्ट से नाम प्राप्त करना है।
आप जो जानते हैं या नहीं जानते, वह यह है कि यह फ़ंक्शन एक वैकल्पिक database_id
. भी स्वीकार करता है तर्क जो SQL सर्वर को बताता है कि कौन सा डेटाबेस object_id
. है के अंतर्गत आता है।
डिफ़ॉल्ट रूप से, SQL सर्वर मानता है कि object_id
वर्तमान डेटाबेस के संदर्भ में है। इस मामले में, एक क्वेरी जो object_id
. का संदर्भ देती है किसी अन्य डेटाबेस में NULL या (इससे भी बदतर) गलत परिणाम लौटाएगा।
उदाहरण 1 - स्थानीय क्वेरी (वर्तमान डेटाबेस से)
सबसे पहले, यहां एक स्थानीय क्वेरी है जो वर्तमान डेटाबेस से ऑब्जेक्ट का नाम लौटाती है:
संगीत का उपयोग करें; चयन नाम AS [विदेशी कुंजी], OBJECT_NAME(parent_object_id) AS [अभिभावक वस्तु का नाम], OBJECT_NAME(referenced_object_id) AS [संदर्भित वस्तु का नाम] Music.sys.foreign_keys से जहां नाम ='FK_Artists_Country';
परिणाम:
डेटाबेस संदर्भ को 'संगीत' में बदला गया।+--------------------------+--------------------- -----+--------------------------+| विदेशी कुंजी | मूल वस्तु का नाम | संदर्भित वस्तु का नाम ||--------------------------+---------------------+- -------------------------|| FK_Artists_देश | कलाकार | देश |+----------------------+--------------------------+--- -----------------------+(1 पंक्ति प्रभावित)
ये परिणाम सही हैं।
यह एक क्रॉस-डेटाबेस क्वेरी नहीं है। वर्तमान डेटाबेस से किसी ऑब्जेक्ट का नाम प्राप्त करते समय इस फ़ंक्शन का उपयोग कैसे किया जाता है, यह दिखाने के लिए यह केवल एक उदाहरण है।
उदाहरण 2 - गलत परिणामों वाली क्रॉस-डेटाबेस क्वेरी!
अब, यहां एक क्रॉस-डेटाबेस क्वेरी है जो गलत परिणाम देती है।
WideWorldImportersDW का उपयोग करें;चुनें नाम AS [विदेशी कुंजी], OBJECT_NAME(parent_object_id) AS [मूल वस्तु का नाम], OBJECT_NAME(referenced_object_id) AS [संदर्भित वस्तु का नाम] Music.sys.foreign_keysWHERE नाम ='FK_Artists_Country' से;>परिणाम:
डेटाबेस संदर्भ को 'WideWorldImportersDW' में बदला।+--------------------------+--------------------- -----+------------------------------------------+| विदेशी कुंजी | मूल वस्तु का नाम | संदर्भित वस्तु का नाम ||--------------------------+---------------------+- ----------------------------|| FK_Artists_देश | सिटीकी | PK_Dimension_Payment_Method |+--------------------------+--------------------------+--- --------------------------+(1 पंक्ति प्रभावित)मैंने केवल एक अलग डेटाबेस पर स्विच किया था, फिर उसी क्वेरी को फिर से चलाएं।
आप देखेंगे कि मेरा
FROM
क्लॉज डेटाबेस के नाम को निर्दिष्ट करने के लिए तीन भागों के नाम का उपयोग करता है (Music
) यह सही विदेशी कुंजी को खोजने की अनुमति देता है। हालांकि, यह समस्याओं को होने से रोकने के लिए पर्याप्त नहीं है।जैसा कि यह निकला,
WideWorldImportersDW
डेटाबेस में समानobject_id
वाले ऑब्जेक्ट हैं जिनका उपयोगMusic
. में किया जाता है डेटाबेस। केवल समस्या यह है कि वे पूरी तरह से अलग वस्तुएं हैं, अलग-अलग नाम हैं। तो अंतिम दो कॉलम में परिणाम फर्जी हैं। ये गलत वस्तुओं के नाम हैं, गलत डेटाबेस पर। मेरी क्रॉस-डेटाबेस क्वेरी ने इसके तारों को पार कर लिया है और गलत ऑब्जेक्ट लौटा दिए हैं!यह विशेष रूप से खतरनाक है, क्योंकि अगर मैं ध्यान नहीं दे रहा था, तो ये परिणाम ठीक लग सकते हैं। आखिरकार, मुझे कोई त्रुटि नहीं मिली।
अगर ये ऑब्जेक्ट आईडी इस डेटाबेस में मौजूद नहीं होते, तो शायद मुझे एक NULL मान मिल जाता (जिससे यह पता लगाना आसान हो जाता है कि परिणामों में कुछ गड़बड़ है)।
किसी भी तरह से, परिणाम बस गलत है ।
उदाहरण 3 - सही परिणामों के साथ क्रॉस-डेटाबेस क्वेरी
पिछले उदाहरण को ठीक करने के लिए (वर्तमान डेटाबेस को बदले बिना), हमें उस डेटाबेस की आईडी की आपूर्ति करने की आवश्यकता है जिससे हम ऑब्जेक्ट का नाम चाहते हैं।
इस तरह:
वाइडवर्ल्ड इम्पोर्टर्स डीडब्ल्यू का उपयोग करें; नाम चुनें [विदेशी कुंजी], OBJECT_NAME (parent_object_id, 5) AS [मूल वस्तु का नाम], OBJECT_NAME (referenced_object_id, 5) AS [संदर्भित वस्तु का नाम] Music.sys.foreign_keysWHERE नाम ='FK_Artists_Country' से;परिणाम:
डेटाबेस संदर्भ को 'WideWorldImportersDW' में बदला।+--------------------------+--------------------- -----+--------------------------+| विदेशी कुंजी | मूल वस्तु का नाम | संदर्भित वस्तु का नाम ||--------------------------+---------------------+- -------------------------|| FK_Artists_देश | कलाकार | देश |+----------------------+--------------------------+--- -----------------------+(1 पंक्ति प्रभावित)फिर से, स्पष्ट होने के लिए, वर्तमान डेटाबेस
WideWorldImportersDW
. है , लेकिन ऑब्जेक्टMusic
. नामक एक भिन्न डेटाबेस पर हैं , जिसकी डेटाबेस आईडी 5 है।उदाहरण 4 - डेटाबेस आईडी कैसे प्राप्त करें
यह काफी संभावना है कि आपको पता नहीं चलेगा कि डेटाबेस की आईडी आपके सिर के ऊपर से क्या है। आप शायद डेटाबेस का नाम जानते होंगे, लेकिन उसकी आईडी नहीं।
सौभाग्य से आप
DB_ID()
. का उपयोग कर सकते हैं डेटाबेस के आईडी को उसके नाम के आधार पर वापस करने के लिए कार्य करता है।इसलिए, हम पिछले उदाहरण को निम्नानुसार संशोधित कर सकते हैं:
वाइडवर्ल्ड इम्पोर्टर्स डीडब्ल्यू का उपयोग करें; नाम चुनें [विदेशी कुंजी], OBJECT_NAME (parent_object_id, DB_ID ('संगीत')) AS [मूल वस्तु का नाम], OBJECT_NAME (referenced_object_id, DB_ID ('संगीत')) AS [संदर्भित वस्तु का नाम] से Music.sys.foreign_keysWHERE नाम ='FK_Artists_Country';परिणाम:
डेटाबेस संदर्भ को 'WideWorldImportersDW' में बदला।+--------------------------+--------------------- -----+--------------------------+| विदेशी कुंजी | मूल वस्तु का नाम | संदर्भित वस्तु का नाम ||--------------------------+---------------------+- -------------------------|| FK_Artists_देश | कलाकार | देश |+----------------------+--------------------------+--- -----------------------+(1 पंक्ति प्रभावित)