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

SQL सर्वर में संदर्भित निकाय खोजें:sys.dm_sql_referenced_entities

SQL सर्वर में, आप sys.dm_sql_referenced_entities() का उपयोग कर सकते हैं सिस्टम डायनेमिक मैनेजमेंट फ़ंक्शन किसी दिए गए निकाय की परिभाषा में नाम से संदर्भित सभी उपयोगकर्ता-परिभाषित संस्थाओं की सूची प्राप्त करने के लिए कार्य करता है।

दूसरे शब्दों में, यह उन सभी उपयोगकर्ता-परिभाषित संस्थाओं की सूची देता है जिन पर एक विशिष्ट इकाई निर्भर करती है।

विशेष रूप से, यह निर्दिष्ट संदर्भ इकाई द्वारा संदर्भित निम्नलिखित इकाई प्रकारों पर रिपोर्ट करता है:

  • स्कीमा-बाउंड इकाइयां
  • गैर-स्कीमा-बाध्य इकाइयां
  • क्रॉस-डेटाबेस और क्रॉस-सर्वर इकाइयां
  • स्कीमा-बाध्य और गैर-स्कीमा-बाध्य निकायों पर स्तंभ-स्तरीय निर्भरता
  • उपयोगकर्ता-परिभाषित प्रकार (उपनाम और सीएलआर यूडीटी)
  • XML स्कीमा संग्रह
  • विभाजन कार्य

सिंटैक्स

वाक्य रचना इस प्रकार है:

sys.dm_sql_referenced_entities (' [ schema_name. ] Referenceing_entity_name ' , '  ' )  ::={ OBJECT | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER }

उदाहरण 1 - मूल उदाहरण

यहां उपयोग का एक उदाहरण दिया गया है:

 परीक्षण का उपयोग करें; [स्कीमा] के रूप में संदर्भित_स्कीमा_नाम का चयन करें, इकाई के रूप में संदर्भित_entity_name, संदर्भित_माइनर_नाम एएस माइनर, संदर्भित_वर्ग_डेस्क एएस क्लास, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ( 'dbo.uspGetClient');
, 'OBJECTClient');

परिणाम:

+----------+---------------+---------------+-------- -----------------------+-------------------------- --+| स्कीमा | इकाई | माइनर | कक्षा | is_select_all | is_all_columns_found ||----------+---------------+---------------+---------- ------------------+-------------------------- -|| डीबीओ | ग्राहक | नल | OBJECT_OR_COLUMN | 1 | 1 || डीबीओ | ग्राहक | क्लाइंट कोड | OBJECT_OR_COLUMN | 1 | 1 || डीबीओ | ग्राहक | प्रथम नाम | OBJECT_OR_COLUMN | 1 | 1 || डीबीओ | ग्राहक | अंतिम नाम | OBJECT_OR_COLUMN | 1 | 1 || नल | क्लाइंट कोड | नल | प्रकार | 0 | 0 |+----------+---------------+---------------+---------- ------------------+-------------------------- -+

यहां मुझे dbo.uspGetClient . में संदर्भित सभी इकाइयां मिलती हैं संग्रहीत प्रक्रिया। इस मामले में पाँच निकाय हैं।

पहला "क्लाइंट" नामक तालिका है। अगले तीन उस तालिका के सभी कॉलम हैं। अंतिम एक उपयोगकर्ता द्वारा परिभाषित उपनाम डेटा प्रकार है जिसे "क्लाइंटकोड" कहा जाता है।

हम यह भी देख सकते हैं कि पहले चार का उपयोग एक चयन कथन में किया जाता है जो तारांकन (*) का उपयोग करता है। ) सभी कॉलम चुनने के लिए वाइल्डकार्ड (क्योंकि उनका is_select_all 1 . पर सेट है )

यहां संग्रहीत कार्यविधि बनाने के लिए उपयोग की जाने वाली वास्तविक परिभाषा है जिसका हम विश्लेषण कर रहे हैं:

प्रक्रिया बनाएं [डीबीओ]। [uspGetClient] @ClientCode क्लाइंटकोड ASSELECT * [dbo] से। 

हां, यह एक बहुत ही सरल संग्रहित प्रक्रिया है, लेकिन यह हमारे उद्देश्यों के लिए आदर्श है। हम सभी संदर्भित संस्थाओं को sys.dm_sql_referenced_entities() द्वारा लौटाए गए अनुसार देख सकते हैं .

हम यह भी देख सकते हैं कि इस प्रक्रिया में एक SELECT होता है क्वेरी जो सभी स्तंभों को चुनने के लिए तारकीय वाइल्डकार्ड का उपयोग करती है।

उदाहरण 2 - "सभी का चयन करें" निकालें (* )

आइए संग्रहीत प्रक्रिया को बदल दें ताकि यह सभी स्तंभों का चयन करने के लिए तारांकन वाइल्डकार्ड का उपयोग न करे।

परिवर्तन प्रक्रिया [डीबीओ]।[uspGetClient] @ClientCode क्लाइंटकोड ASSELECT FirstName, LastNameFROM [dbo]। 

तो अब यह स्पष्ट रूप से "फर्स्टनाम" और "लास्टनाम" कॉलम लौटाता है। कोई वाइल्डकार्ड नहीं मिला।

अब sys.dm_sql_referenced_entities() चलाएं फिर से:

 परीक्षण का उपयोग करें; [स्कीमा] के रूप में संदर्भित_स्कीमा_नाम का चयन करें, इकाई के रूप में संदर्भित_entity_name, संदर्भित_माइनर_नाम एएस माइनर, संदर्भित_वर्ग_डेस्क एएस क्लास, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ( 'dbo.uspGetClient');
, 'OBJECTClient');

परिणाम:

+----------+---------------+---------------+-------- -----------------------+-------------------------- --+| स्कीमा | इकाई | माइनर | कक्षा | is_select_all | is_all_columns_found ||----------+---------------+---------------+---------- ------------------+-------------------------- -|| डीबीओ | ग्राहक | नल | OBJECT_OR_COLUMN | 0 | 1 || डीबीओ | ग्राहक | क्लाइंट कोड | OBJECT_OR_COLUMN | 0 | 1 || डीबीओ | ग्राहक | प्रथम नाम | OBJECT_OR_COLUMN | 0 | 1 || डीबीओ | ग्राहक | अंतिम नाम | OBJECT_OR_COLUMN | 0 | 1 || नल | क्लाइंट कोड | नल | प्रकार | 0 | 0 |+----------+---------------+---------------+---------- ------------------+-------------------------- -+

इस बार, is_select_all कॉलम 0 दिखाता है सभी पंक्तियों पर।

उदाहरण 3 - एक गैर-मौजूद इकाई को संदर्भित करना

क्या होगा यदि आपकी इकाई एक अस्तित्वहीन इकाई का संदर्भ देती है?

उदाहरण के लिए, क्या होगा यदि आपका सहयोगी एक कॉलम छोड़ देता है जिसे वास्तव में संग्रहीत प्रक्रिया द्वारा संदर्भित किया जा रहा है, और फिर आप sys.dm_sql_referenced_entities() चलाते हैं उस संग्रहीत कार्यविधि के विरुद्ध?

आइए जानें।

तालिका बदलें [dbo]।[क्लाइंट] DROP COLUMN LastName;

मैंने अभी-अभी LastName को छोड़ दिया है मेरी टेबल से कॉलम।

अब sys.dm_sql_referenced_entities() चलाएं फिर से:

संदर्भित_स्कीमा_नाम एएस [स्कीमा], संदर्भित_इकाई_नाम एएस इकाई, संदर्भित_माइनर_नाम एएस माइनर, रेफरेंस्ड_क्लास_डेस्क एएस क्लास, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ( 'dbo.uspGetClient');
'OBJECT')

परिणाम:

संदेश 207, स्तर 16, राज्य 1, प्रक्रिया uspGetClient, पंक्ति 4अमान्य स्तंभ नाम 'अंतिम नाम'। संदेश 2020, स्तर 16, राज्य 1, पंक्ति 3संस्था "dbo.uspGetClient" के लिए रिपोर्ट की गई निर्भरता में सभी स्तंभों के संदर्भ शामिल नहीं हो सकते हैं . यह या तो इसलिए है क्योंकि निकाय किसी ऐसी वस्तु का संदर्भ देता है जो अस्तित्व में नहीं है या इकाई में एक या अधिक कथनों में त्रुटि के कारण है। क्वेरी को फिर से चलाने से पहले, सुनिश्चित करें कि निकाय में कोई त्रुटि नहीं है और निकाय द्वारा संदर्भित सभी ऑब्जेक्ट मौजूद हैं।

उदाहरण 4 - पूरी तालिका गिराएं

आइए जानें कि अगर हम पूरी तालिका को गिरा दें तो क्या होगा।

ड्रॉप टेबल क्लाइंट;

तालिका गिरा दी गई है।

sys.dm_sql_referenced_entities()चलाएं :

संदर्भित_स्कीमा_नाम एएस [स्कीमा], संदर्भित_इकाई_नाम एएस इकाई, संदर्भित_माइनर_नाम एएस माइनर, रेफरेंस्ड_क्लास_डेस्क एएस क्लास, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ( 'dbo.uspGetClient');
'OBJECT')

परिणाम:

Msg 2020, लेवल 16, स्टेट 1, लाइन 2इकाई "dbo.uspGetClient" के लिए रिपोर्ट की गई निर्भरता में सभी कॉलम के संदर्भ शामिल नहीं हो सकते हैं। यह या तो इसलिए है क्योंकि निकाय किसी ऐसी वस्तु का संदर्भ देता है जो अस्तित्व में नहीं है या इकाई में एक या अधिक कथनों में त्रुटि के कारण है। क्वेरी को फिर से चलाने से पहले, सुनिश्चित करें कि निकाय में कोई त्रुटि नहीं है और निकाय द्वारा संदर्भित सभी ऑब्जेक्ट मौजूद हैं।

उदाहरण 5 - सभी कॉलम लौटाएं

Microsoft विशेष रूप से तारांकन (* .) के उपयोग के विरुद्ध अनुशंसा करता है ) गतिशील प्रबंधन दृश्यों और कार्यों से सभी स्तंभों का चयन करने के लिए (जिनमें से sys.dm_sql_referenced_entities() एक है)। ऐसा इसलिए है क्योंकि उनके स्कीमा और उनके द्वारा लौटाया गया डेटा SQL सर्वर के भविष्य के रिलीज़ में बदल सकता है। इसके परिणामस्वरूप भविष्य में रिलीज में कॉलम सूची के अंत में कॉलम जोड़े जा सकते हैं, जो आपके आवेदन को गड़बड़ कर सकता है यदि आप सभी कॉलम चुनने के लिए तारांकन पर भरोसा कर रहे हैं।

उस ने कहा, यहाँ एक उदाहरण है जो बस यही करता है:तारांकन का उपयोग करता है (* ) sys.dm_sql_referenced_entities() . से सभी कॉलम चुनने के लिए . मैं केवल आपको यह दिखाने के लिए कर रहा हूं कि वास्तव में इस फ़ंक्शन से कौन से कॉलम लौटाए गए हैं (कम से कम SQL सर्वर 2019 में)।

Sys.dm_sql_referenced_entities से चुनें ('dbo.uspGetClient', 'OBJECT');

परिणाम (ऊर्ध्वाधर आउटपुट का उपयोग करके):

-[रिकॉर्ड 1]--------------------------referencing_minor_id | 0referenced_server_name | NULLreferenced_database_name | NULLreferenced_schema_name | dboreferenced_entity_name | Clientreferenced_minor_name | NULLreferenced_id | 434100587referenced_minor_id | 0referenced_class | 1referenced_class_desc | OBJECT_OR_COLUMNis_caller_निर्भर | 0is_अस्पष्ट | 0is_चयनित | 1is_updated | 0is_select_all | 0is_all_columns_found | 1is_insert_all | 0is_अपूर्ण | 0- [रिकॉर्ड 2] ---------------------------- रेफरेंसिंग_माइनर_आईडी | 0referenced_server_name | NULLreferenced_database_name | NULLreferenced_schema_name | dboreferenced_entity_name | Clientreferenced_minor_name | ClientCodereferenced_id | 434100587referenced_minor_id | 1referenced_class | 1referenced_class_desc | OBJECT_OR_COLUMNis_caller_निर्भर | 0is_अस्पष्ट | 0is_चयनित | 1is_updated | 0is_select_all | 0is_all_columns_found | 1is_insert_all | 0is_अपूर्ण | 0-[रिकॉर्ड 3]--------------------------- रेफरेंसिंग_माइनर_आईडी | 0referenced_server_name | NULLreferenced_database_name | NULLreferenced_schema_name | dboreferenced_entity_name | Clientreferenced_minor_name | FirstNamereferenced_id | 434100587referenced_minor_id | 2referenced_class | 1referenced_class_desc | OBJECT_OR_COLUMNis_caller_निर्भर | 0is_अस्पष्ट | 0is_चयनित | 1is_updated | 0is_select_all | 0is_all_columns_found | 1is_insert_all | 0is_अपूर्ण | 0- [रिकॉर्ड 4] ---------------------------- रेफरेंसिंग_माइनर_आईडी | 0referenced_server_name | NULLreferenced_database_name | NULLreferenced_schema_name | dboreferenced_entity_name | Clientreferenced_minor_name | LastNamereferenced_id | 434100587referenced_minor_id | 3referenced_class | 1referenced_class_desc | OBJECT_OR_COLUMNis_caller_निर्भर | 0is_अस्पष्ट | 0is_चयनित | 1is_updated | 0is_select_all | 0is_all_columns_found | 1is_insert_all | 0is_अपूर्ण | 0- [रिकॉर्ड 5]--------------------------- रेफरेंसिंग_माइनर_आईडी | 0referenced_server_name | NULLreferenced_database_name | NULLreferenced_schema_name | NULLreferenced_entity_name | clientcodereferenced_minor_name | NULLreferenced_id | 257referenced_minor_id | 0referenced_class | 6referenced_class_desc | TYPEis_caller_निर्भर | 0is_अस्पष्ट | 0is_चयनित | 0is_updated | 0is_select_all | 0is_all_columns_found | 0is_insert_all | 0is_अपूर्ण | 0(5 पंक्तियाँ प्रभावित)

आधिकारिक दस्तावेज़ीकरण

अधिक विस्तृत जानकारी और उदाहरणों के लिए, देखें sys.dm_sql_referenced_entities माइक्रोसॉफ्ट वेबसाइट पर।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं SQL सर्वर से HTTP अनुरोध कैसे कर सकता हूं?

  2. सी # में संग्रहित प्रक्रिया से वापसी मूल्य प्राप्त करना

  3. SQL सर्वर एक मिलीसेकंड क्यों खो रहा है?

  4. ORDER BY क्लॉज विचारों, इनलाइन कार्यों, व्युत्पन्न तालिकाओं, उपश्रेणियों और सामान्य तालिका अभिव्यक्तियों में अमान्य है

  5. SQL सर्वर मौजूदा तालिका में चुनें