यह आलेख SQL सर्वर में डेटाबेस में विदेशी कुंजियों वाली सभी तालिकाओं को वापस करने के सात तरीके प्रदान करता है।
प्रत्येक तालिका को केवल एक बार लौटाया जाता है, भले ही उसके पास कितनी भी विदेशी कुंजियाँ हों। यह सभी विदेशी कुंजियों को उनकी तालिकाओं के साथ वापस करने के लिए अलग है। यदि आप ऐसा करना चाहते हैं, तो SQL सर्वर में विदेशी कुंजियों को वापस करने के 11 तरीके देखें।
यहां सभी उदाहरण एक ही डेटाबेस से पूछताछ करते हैं, और इसलिए वही परिणाम लौटाते हैं।
विकल्प 1 - OBJECTPROPERTY() sys.tables के साथ
पहला विकल्प OBJECTPROPERTY()
. का उपयोग करना है sys.tables
. को क्वेरी करते समय कार्य करें सिस्टम दृश्य।
यह फ़ंक्शन एक TableHasForeignKey
. को स्वीकार करता है तर्क, जो या तो 1
. होगा या 0
(या NULL
) अगर यह 1
है , इसका मतलब है कि तालिका में एक विदेशी कुंजी है। 0
. का मान इसका मतलब है कि इसमें कोई विदेशी कुंजी नहीं है। इसलिए, हम इसका उपयोग WHERE
. में कर सकते हैं केवल उन तालिकाओं को वापस करने के लिए खंड जहां TableHasForeignKey
1
. पर सेट है ।
चुनें SCHEMA_NAME(schema_id) AS [स्कीमा], नाम AS [टेबल] sys.tables से जहां OBJECTPROPERTY(object_id, 'TableHasForeignKey') =1ORDER BY [स्कीमा], [टेबल];
परिणाम:
+----------+------------+| स्कीमा | टेबल ||----------+---------------|| डीबीओ | एल्बम || डीबीओ | कलाकार |+----------+-----------+
विकल्प 2 - OBJECTPROPERTY() INFORMATION_SCHEMA.TABLES के साथ
यह उदाहरण OBJECTPROPERTY()
. का उपयोग करता है INFORMATION_SCHEMA.TABLES
. को क्वेरी करते समय सिस्टम दृश्य।
TABLE_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLE_NAMEFROM OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)),'TableHasForeignKey') =1 ANDTABLE_TYPE' परिणाम:+----------------+--------------+| TABLE_SCHEMA | TABLE_NAME ||--------------+--------------|| डीबीओ | एल्बम || डीबीओ | कलाकार |+----------------+--------------+विकल्प 3 - OBJECTPROPERTY() sys.objects के साथ
यहां एक और विकल्प है जो
OBJECTPROPERTY()
. का उपयोग करता है . इस बार मैं इसका उपयोगsys.objects
. को क्वेरी करते समय करता हूं सिस्टम दृश्य।चुनें SCHEMA_NAME(schema_id) AS [स्कीमा], नाम AS [टेबल] sys.objects से जहां टाइप करें ='U'और OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', name)), 'TableHasForeignKey ') =[स्कीमा], [तालिका] द्वारा 1 आदेशपरिणाम:
+----------+------------+| स्कीमा | टेबल ||----------+---------------|| डीबीओ | एल्बम || डीबीओ | कलाकार |+----------+-----------+विकल्प 4 - INFORMATION_SCHEMA.TABLE_CONSTRAINTS DISTINCT के साथ
यहां एक उदाहरण दिया गया है जो
INFORMATION_SCHEMA.TABLE_CONSTRAINTS
से पूछताछ करता है सिस्टम दृश्य जहां बाधा प्रकार हैFOREIGN KEY
. इस मामले में, मैंDISTINCT
. का भी उपयोग करता हूं एक से अधिक विदेशी कुंजी होने पर तालिकाओं को एक से अधिक बार वापस आने से रोकने के लिए खंड।INFORMATION_SCHEMA से DISTINCT CONSTRAINT_SCHEMA, TABLE_NAME चुनें।TABLE_CONSTRAINTSWHERE CONSTRAINT_TYPE ='विदेशी कुंजी';परिणाम:
+---------------------+--------------+| CONSTRAINT_SCHEMA | TABLE_NAME ||---------------------+--------------|| डीबीओ | एल्बम || डीबीओ | कलाकार |+---------------------+--------------+अगर मैं
DISTINCT
. को हटा दूं तो यहां बताया गया है कि क्या होता है खंड:INFORMATION_SCHEMA से CONSTRAINT_SCHEMA, TABLE_NAME चुनें।TABLE_CONSTRAINTSWHERE CONSTRAINT_TYPE ='विदेशी कुंजी';परिणाम:
+---------------------+--------------+| CONSTRAINT_SCHEMA | TABLE_NAME ||---------------------+--------------|| डीबीओ | एल्बम || डीबीओ | एल्बम || डीबीओ | कलाकार |+---------------------+--------------+इस मामले में
Albums
तालिका में दो विदेशी कुंजियाँ हैं, और इसलिए मुझे उस एक तालिका के लिए दो पंक्तियाँ मिलती हैं।विकल्प 5 - sys.forign_keys DISTINCT के साथ
यहां एक और उदाहरण दिया गया है जो
DISTINCT
. का उपयोग करता है खंड, लेकिन इस बार मैंsys.foreign_keys
. को क्वेरी कर रहा हूं सिस्टम दृश्य।चुनें DISTINCT OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [स्कीमा], OBJECT_NAME(fk.parent_object_id) AS [टेबल]FROM sys.foreign_keys AS fkORDER by [स्कीमा], [टेबल];परिणाम:
+----------+------------+| स्कीमा | टेबल ||----------+---------------|| डीबीओ | एल्बम || डीबीओ | कलाकार |+----------+-----------+और यहाँ यह
DISTINCT
. के बिना है खंड:चुनें OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [स्कीमा], OBJECT_NAME(fk.parent_object_id) AS [टेबल]FROM sys.foreign_keys AS fkORDER BY [स्कीमा], [टेबल];परिणाम:
+----------+------------+| स्कीमा | टेबल ||----------+---------------|| डीबीओ | एल्बम || डीबीओ | एल्बम || डीबीओ | कलाकार |+----------+-----------+विकल्प 6 - ग्रुप बाय के साथ sys.foreign_keys
यह पिछले उदाहरण के समान है जिसमें यह
sys.foreign_keys
. से पूछताछ करता है सिस्टम दृश्य। अंतर यह है कि,DISTINCT
. का उपयोग करने के बजाय खंड, यहGROUP BY
. का उपयोग करता है इसके बजाय खंड।चुनें OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [स्कीमा], OBJECT_NAME(fk.parent_object_id) AS [टेबल]FKGROUP BY OBJECT_SCHEMA_NAME(f.parent_object_id), OBJECT_NAME(fk.parent_object_id) से।परिणाम:
+----------+------------+| स्कीमा | टेबल ||----------+---------------|| डीबीओ | एल्बम || डीबीओ | कलाकार |+----------+-----------+विकल्प 7 - OBJECTPROPERTYEX()
यह उदाहरण पिछले कुछ उदाहरणों पर दोगुना हो सकता है, लेकिन यह अभी भी ध्यान देने योग्य है।
पिछले उदाहरणों में से कोई भी जो
OBJECTPROPERTY()
. का उपयोग करता है फ़ंक्शन, आसानी सेOBJECTPROPERTYEX()
. का उपयोग करने के लिए फिर से लिखा जा सकता है समारोह। यह फ़ंक्शन मूल रूप सेOBJECTPROPERTY()
. का एक्सटेंशन है , और यह सब कुछ करता हैOBJECTPROPERTY()
करता है और बहुत कुछ।इसलिए मैं इस पृष्ठ पर निम्नलिखित के साथ पहला उदाहरण फिर से लिख सकता हूं:
चुनें SCHEMA_NAME(schema_id) AS [स्कीमा], नाम AS [टेबल] sys.tables से जहां OBJECTPROPERTYEX(object_id, 'TableHasForeignKey') =1ORDER BY [स्कीमा], [टेबल];परिणाम:
+----------+------------+| स्कीमा | टेबल ||----------+---------------|| डीबीओ | एल्बम || डीबीओ | कलाकार |+----------+-----------+आपको एक अंतर के बारे में पता होना चाहिए कि ये दो कार्य अलग-अलग रिटर्न प्रकार लौटाते हैं।
OBJECTPROPERTY()
एक int . लौटाता है जबकिOBJECTPROPERTYEX()
एक sql_variant . लौटाता है टाइप करें।