Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में प्राथमिक कुंजी के बिना सभी तालिकाओं को वापस करने के 3 तरीके

यदि आपको कभी यह पता लगाने की आवश्यकता है कि क्या किसी डेटाबेस में कोई तालिका है जिसमें प्राथमिक कुंजी नहीं है, तो आप केवल उन तालिकाओं को वापस करने के लिए SQL सर्वर में निम्न में से कोई भी स्क्रिप्ट चला सकते हैं।

ये सभी स्क्रिप्ट OBJECTPROPERTY() . का लाभ उठाती हैं समारोह। यह फ़ंक्शन एक TableHasPrimaryKey को स्वीकार करता है तर्क है कि आप 0 . के मान की जांच कर सकते हैं . अगर यह 0 है , तालिका में प्राथमिक कुंजी नहीं है। अगर यह 1 है ऐसा होता है। इसलिए, आप इस फ़ंक्शन का उपयोग साथ . सभी तालिकाओं को वापस करने के लिए भी कर सकते हैं एक प्राथमिक कुंजी।

ये स्क्रिप्ट केवल तालिका का नाम और उसकी स्कीमा लौटाती हैं, लेकिन अधिक कॉलम वापस करने के लिए आप उन्हें हमेशा संशोधित कर सकते हैं।

विकल्प 1 - OBJECTPROPERTY() sys.tables के साथ

sys.tables सिस्टम व्यू शायद शुरू करने के लिए सबसे स्पष्ट जगह है। यह दृश्य प्रत्येक उपयोगकर्ता तालिका के लिए एक पंक्ति देता है, और जब हम OBJECTPROPERTY() . का उपयोग करते हैं TableHasPrimaryKey . के आधार पर परिणामों को फ़िल्टर करने के लिए संपत्ति 0 . है , हम बिना प्राथमिक कुंजी के केवल वे तालिकाएँ प्राप्त करते हैं।

 परीक्षण का उपयोग करें; [स्कीमा] के रूप में SCHEMA_NAME(schema_id) का चयन करें, जैसा नाम [तालिका] sys.tables से जहां OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') =[स्कीमा], [टेबल] द्वारा 0ORDER;

परिणाम:

डेटाबेस संदर्भ को 'परीक्षण' में बदला गया।+----------+--------------------------+| स्कीमा | टेबल ||----------+--------------------------|| डीबीओ | डेटटाइम2टेस्ट || डीबीओ | डेटटाइम2टेस्ट2 || डीबीओ | डेटटाइमऑफसेटटेस्ट || डीबीओ | व्यक्तिगत || डीबीओ | व्यवसाय || डीबीओ | टीम || डीबीओ | टाइमटेस्ट |+----------+--------------------------+(7 पंक्तियाँ प्रभावित)

इस मामले में, मेरा वर्तमान डेटाबेस प्राथमिक कुंजी के बिना तालिकाओं के समूह के साथ एक परीक्षण डेटाबेस है।

यदि मैं उसी कथन को किसी अन्य डेटाबेस पर चलाता हूं, तो मुझे कोई परिणाम नहीं मिलता है:

संगीत का उपयोग करें; [स्कीमा] के रूप में SCHEMA_NAME(schema_id) का चयन करें, जैसा नाम [तालिका]sys.tables से जहां OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') =[स्कीमा], [टेबल] द्वारा 0ORDER;

परिणाम:

डेटाबेस संदर्भ को 'संगीत' में बदल दिया।(0 पंक्तियाँ प्रभावित)

विकल्प 2 - OBJECTPROPERTY() INFORMATION_SCHEMA.TABLES के साथ

यह उदाहरण पिछले वाले के समान है, इस समय को छोड़कर मैं INFORMATION_SCHEMA.TABLES को क्वेरी कर रहा हूं दृश्य। SQL सर्वर में शामिल सूचना स्कीमा दृश्य INFORMATION_SCHEMA के लिए ISO मानक परिभाषा का अनुपालन करते हैं।

उपयोग परीक्षण; INFORMATION_SCHEMA से TABLE_SCHEMA, TABLE_NAME का चयन करें।> 

परिणाम:

डेटाबेस संदर्भ को 'परीक्षण' में बदला गया | TABLE_SCHEMA | TABLE_NAME ||----------------+--------------------------|| डीबीओ | डेटटाइम2टेस्ट || डीबीओ | डेटटाइम2टेस्ट2 || डीबीओ | डेटटाइमऑफसेटटेस्ट || डीबीओ | व्यक्तिगत || डीबीओ | व्यवसाय || डीबीओ | टीम || डीबीओ | टाइमटेस्ट |+----------------+---------------------+(7 पंक्तियाँ प्रभावित)

विकल्प 3 - OBJECTPROPERTY() sys.objects के साथ

इस उदाहरण में, मैं sys.objects . को क्वेरी करता हूं दृश्य। पिछले दो की तुलना में यह एक अधिक सामान्य दृश्य है, और यह स्कीमा-स्कोप्ड ऑब्जेक्ट्स (केवल टेबल नहीं) के बारे में जानकारी देता है। इस वजह से, हमें type = 'U' . का उपयोग करके परिणामों को फ़िल्टर करने की आवश्यकता है . U यहाँ उपयोगकर्ता परिभाषित तालिका के लिए खड़ा है।

फिर से, हम OBJECTPROPERTY() . का उपयोग कर सकते हैं परिणामों को केवल उन तालिकाओं में फ़िल्टर करने के लिए कार्य करता है जिनमें प्राथमिक कुंजी नहीं होती है।

 टेस्ट का उपयोग करें; SCHEMA_NAME(schema_id) AS [स्कीमा], नाम AS [टेबल] sys.objects से जहां टाइप करें ='U'और OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', name)) का चयन करें। , 'TableHasPrimaryKey') =0 [स्कीमा] द्वारा आदेश, [तालिका]

परिणाम:

डेटाबेस संदर्भ को 'परीक्षण' में बदला गया।+----------+--------------------------+| स्कीमा | टेबल ||----------+--------------------------|| डीबीओ | डेटटाइम2टेस्ट || डीबीओ | डेटटाइम2टेस्ट2 || डीबीओ | डेटटाइमऑफसेटटेस्ट || डीबीओ | व्यक्तिगत || डीबीओ | व्यवसाय || डीबीओ | टीम || डीबीओ | टाइमटेस्ट |+----------+--------------------------+(7 पंक्तियाँ प्रभावित)

हम वैकल्पिक रूप से इसे type_desc = 'USER_TABLE' . द्वारा फ़िल्टर कर सकते हैं , जो समान परिणाम देगा।

 टेस्ट का उपयोग करें; SCHEMA_NAME(schema_id) AS [स्कीमा], नाम AS [टेबल] sys.objects से चुनें जहां type_desc ='USER_TABLE' और OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', name)) , 'TableHasPrimaryKey') =0 [स्कीमा] द्वारा आदेश, [तालिका]

परिणाम:

डेटाबेस संदर्भ को 'परीक्षण' में बदला गया।+----------+--------------------------+| स्कीमा | टेबल ||----------+--------------------------|| डीबीओ | डेटटाइम2टेस्ट || डीबीओ | डेटटाइम2टेस्ट2 || डीबीओ | डेटटाइमऑफसेटटेस्ट || डीबीओ | व्यक्तिगत || डीबीओ | व्यवसाय || डीबीओ | टीम || डीबीओ | टाइमटेस्ट |+----------+--------------------------+(7 पंक्तियाँ प्रभावित)

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. इन-मेमोरी OLTP:SQL सर्वर 2016 में नया क्या है

  2. एक चर को एक ट्रिगर में पास करें

  3. डायनेमिक sql स्टेटमेंट में टेबल वेरिएबल का उपयोग कैसे करें?

  4. सप्ताह की शुरुआत तिथि और सप्ताह की समाप्ति तिथि सप्ताह संख्या से प्राप्त करें

  5. पंक्तियों से अधिकतम मूल्य प्राप्त करना और किसी अन्य तालिका में शामिल होना