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

SQL सर्वर के sys.dm_sql_referenced_entities() का उदाहरण एक लिंक किए गए सर्वर को संदर्भित करने वाली इकाई को लौटाना

sys.dm_sql_referenced_entities() . के बारे में एक बात सिस्टम डायनेमिक मैनेजमेंट फ़ंक्शन यह है कि आप इसे क्रॉस-डेटाबेस और क्रॉस-सर्वर संस्थाओं पर उपयोग कर सकते हैं।

इसका मतलब है कि आप संदर्भित इकाइयां ढूंढ सकते हैं जो एक अलग डेटाबेस में हैं और यहां तक ​​कि एक अलग सर्वर पर भी हैं।

यह आलेख sys.dm_sql_referenced_entities() . का एक उदाहरण प्रदान करता है एक संग्रहीत प्रक्रिया को वापस करना जो किसी लिंक किए गए सर्वर पर डेटाबेस से पूछताछ करता है।

उदाहरण 1 - संग्रहित प्रक्रिया

सबसे पहले, एक संग्रहित प्रक्रिया बनाते हैं जो लिंक किए गए सर्वर से डेटा लौटाती है:

CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int ASSELECT AlbumNameFROM [होमर]। 

हम देख सकते हैं कि संग्रहीत प्रक्रिया डेटाबेस तालिका को संदर्भित करने के लिए चार-भाग के नाम का उपयोग करती है। ऐसा इसलिए है क्योंकि डेटाबेस एक अलग सर्वर पर है जिसे सर्वर से लिंक किए गए सर्वर के रूप में कॉन्फ़िगर किया गया है जो संग्रहीत प्रक्रिया स्थित है।

दूसरे शब्दों में, यह संग्रहीत कार्यविधि किसी लिंक किए गए सर्वर से डेटा लौटाती है।

इस उदाहरण में, Homer लिंक किया गया सर्वर है, और Music डेटाबेस है।

उदाहरण 2 - sys.dm_sql_referenced_entities() को संग्रहीत प्रक्रिया के विरुद्ध चलाएँ

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

संदर्भित_सर्वर_नाम एएस [सर्वर], संदर्भित_डेटाबेस_नाम एएस [डेटाबेस], संदर्भित_स्कीमा_नाम एएस [स्कीमा], संदर्भित_entity_name एएस [इकाई], संदर्भित_माइनर_नाम एएस [मामूली], संदर्भित_क्लास_डेस्क एएस [कक्षा] sys.dm_sql_referenced_usp से संदर्भित करें। 'ऑब्जेक्ट');

परिणाम:

+----------+---------------+----------+----------+ ---------+---------------------+| सर्वर | डाटाबेस | स्कीमा | इकाई | माइनर | कक्षा ||----------+---------------+----------+----------+- --------+---------------------|| होमर | संगीत | डीबीओ | एल्बम | नल | OBJECT_OR_COLUMN |+----------+---------------+----------+----------+- --------+---------------------+

तो यह सफलतापूर्वक तालिका को संदर्भित किया जा रहा है (हालांकि कॉलम/मामूली नाम नहीं)। इसमें सर्वर का नाम भी शामिल है ( होमर ) और डेटाबेस का नाम ( संगीत )।

ध्यान दें कि मैंने संक्षिप्तता के लिए इस उदाहरण के सभी कॉलम वापस नहीं किए हैं।

उदाहरण 3 - लिंक किए गए सर्वर पर sys.dm_sql_referenced_entities() चलाना

यदि संग्रहीत कार्यविधि वास्तविक (दूरस्थ) लिंक किए गए सर्वर पर होती तो क्या वे परिणाम हमें प्राप्त होने वाले परिणामों से भिन्न दिखते हैं?

चलो यह कोशिश करते हैं।

यहां, मैं दूसरे सर्वर पर जाता हूं और निम्नलिखित कोड चलाता हूं:

CREATE PROCEDURE [dbo]।[uspGetAlbumsByArtist] @ArtistId int ASSELECT AlbumNameFROM [dbo]। 

ध्यान दें कि मुझे चार भागों के नामकरण का उपयोग करने की आवश्यकता नहीं है, क्योंकि यह एक ही सर्वर को क्वेरी कर रहा है।

अब sys.dm_sql_referenced_entities() चलाएं लिंक किए गए सर्वर पर:

संदर्भित_सर्वर_नाम एएस [सर्वर], संदर्भित_डेटाबेस_नाम एएस [डेटाबेस], संदर्भित_स्कीमा_नाम एएस [स्कीमा], संदर्भित_एंटी_नाम एएस [इकाई], संदर्भित_माइनर_नाम एएस [मामूली], संदर्भित_क्लास_डेस्क एएस [वर्ग] sys.dm_sql_referencedboentities से संदर्भित (आर्टपएल्म्स से sys.dm_sql_referenced_entities। ', 'ऑब्जेक्ट');

परिणाम:

+----------+---------------+----------+----------+ -----------+---------------------+| सर्वर | डाटाबेस | स्कीमा | इकाई | माइनर | कक्षा ||----------+---------------+----------+----------+- ----------+---------------------|| नल | नल | डीबीओ | एल्बम | नल | OBJECT_OR_COLUMN || नल | नल | डीबीओ | एल्बम | एल्बम का नाम | OBJECT_OR_COLUMN || नल | नल | डीबीओ | एल्बम | कलाकार आईडी | OBJECT_OR_COLUMN |+----------+---------------+----------+----------+- ----------+---------------------+

इस मामले में, कॉलम परिणामों में शामिल हैं।

यह भी ध्यान दें कि सर्वर और डेटाबेस कॉलम सभी पंक्तियों के लिए NULL हैं। ऐसा इसलिए है क्योंकि इनमें से कोई भी संग्रहीत कार्यविधि की परिभाषा में शामिल नहीं है। यदि मैं सर्वर और डेटाबेस को शामिल करने के लिए संग्रहीत कार्यविधि की परिभाषा को बदलता हूं, तो मैं उन्हें यहां देखूंगा। हालाँकि, सर्वर केवल पहली पंक्ति में दिखाई देता है।

 परिवर्तन प्रक्रिया [डीबीओ]। [uspGetAlbumsByArtist] @ArtistId int ASSELECT AlbumNameFROM [SQLServer007]। 

परिणाम:

+--------------+---------------+----------+---------- ---+----------+---------------------+| सर्वर | डाटाबेस | स्कीमा | इकाई | माइनर | कक्षा ||--------------+---------------+----------+------- ---+----------+----------------------|| SQLServer007 | संगीत | डीबीओ | एल्बम | नल | OBJECT_OR_COLUMN || नल | संगीत | डीबीओ | एल्बम | एल्बम का नाम | OBJECT_OR_COLUMN || नल | संगीत | डीबीओ | एल्बम | कलाकार आईडी | OBJECT_OR_COLUMN |+--------------+---------------+----------+-------- --------------+---------------------+

इस मामले में, सर्वर का नाम SQLServer007 है, इसलिए मुझे होमर के बजाय इसका उपयोग करना पड़ा (जो कि दूसरे सर्वर से लिंक सर्वर बनाते समय मैंने इसे दिया था)।

हम OPENQUERY() . का भी उपयोग कर सकते हैं अगर हम स्थानीय सर्वर पर वापस कूदना चाहते हैं और इसे लिंक किए गए सर्वर के विरुद्ध चलाना चाहते हैं:

 चयन करें * OPENQUERY से (होमर, 'संदर्भित_सर्वर_नाम एएस [सर्वर], संदर्भित_डेटाबेस_नाम एएस [डेटाबेस], संदर्भित_स्कीमा_नाम एएस [स्कीमा], संदर्भित_entity_name एएस [इकाई], संदर्भित_माइनर_नाम एएस [मामूली], संदर्भित_क्लास_डेस्क एएस [कक्षा] एसआईएस से संदर्भित। dm_sql_referenced_entities ( ''[dbo].uspGetAlbumsByArtist'', ''OBJECT'');');

परिणाम:

+--------------+---------------+----------+---------- ---+----------+---------------------+| सर्वर | डाटाबेस | स्कीमा | इकाई | माइनर | कक्षा ||--------------+---------------+----------+------- ---+----------+----------------------|| SQLServer007 | संगीत | डीबीओ | एल्बम | नल | OBJECT_OR_COLUMN || नल | संगीत | डीबीओ | एल्बम | एल्बम का नाम | OBJECT_OR_COLUMN || नल | संगीत | डीबीओ | एल्बम | कलाकार आईडी | OBJECT_OR_COLUMN |+--------------+---------------+----------+-------- --------------+---------------------+

ध्यान दें कि इस मामले में मुझे सभी एकल उद्धरण वर्णों से बचना था।

साथ ही, अगर मैं एक वितरित क्वेरी के माध्यम से फ़ंक्शन चलाने का प्रयास करता हूं (OPENQUERY() का उपयोग किए बिना ), मुझे त्रुटि संदेश 4122 मिलता है:

संदर्भित_सर्वर_नाम एएस [सर्वर], संदर्भित_डेटाबेस_नाम एएस [डेटाबेस], संदर्भित_स्कीमा_नाम एएस [स्कीमा], संदर्भित_एंटी_नाम एएस [इकाई], संदर्भित_माइनर_नाम एएस [मामूली], संदर्भित_क्लास_डेस्क एएस [कक्षा] [होमर] से [म्यूजिक]।[sys ].dm_sql_referenced_entities ('[dbo].[uspGetAlbumsByArtist]', 'OBJECT');

परिणाम:

संदेश 4122, स्तर 16, राज्य 1, पंक्ति 10दूरस्थ तालिका-मूल्यवान फ़ंक्शन कॉल की अनुमति नहीं है।

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. प्रत्येक संकलन के बाद पहली बार लोड करने के लिए इकाई ढांचा बहुत धीमा

  2. SQL सर्वर (लोकलडीबी)\v11.0 समझाया गया

  3. सी # प्रोग्राम के भीतर संग्रहीत प्रक्रिया को कैसे निष्पादित करें

  4. jdbctemplate के माध्यम से एसक्यूएल डालने से पहचान

  5. क्या SQL सर्वर वेब अनुरोध भेज सकता है?