डेटाबेस दृश्यों के बारे में महान चीजों में से एक यह है कि वे आपको अंतर्निहित डेटाबेस स्कीमा को जानने की आवश्यकता के बिना जटिल प्रश्नों को चलाने की अनुमति देते हैं।
हां, यह सच है कि जब आप दृश्य बनाते हैं तो आपको अंतर्निहित स्कीमा जानने की आवश्यकता होती है, लेकिन आपको केवल एक बार ऐसा करने की आवश्यकता होती है। एक बार जब आप इसे बना लेते हैं, तो आप सभी टेबल और कॉलम नामों आदि को याद किए बिना पूरे दिन उस दृश्य को क्वेरी कर सकते हैं।
दृश्य आम तौर पर एकाधिक तालिकाओं के डेटा को एक एकल, आभासी तालिका में संयोजित करते हैं, जो इसे "ब्लैक बॉक्स" की तरह बनाता है। जब तक यह डिज़ाइन के अनुसार काम करता है, तब तक आपको छिपे हुए विवरणों के बारे में चिंता करने की ज़रूरत नहीं है।
लेकिन क्या होगा अगर आप करें इसकी अंतर्निहित तालिकाओं और स्तंभों के लिए एक दृश्य देखना चाहते हैं?
जबकि sp_help
सिस्टम संग्रहीत प्रक्रिया आपको दृश्य द्वारा लौटाए गए कॉलम के बारे में जानकारी प्रदान करेगी, यह दृश्य में संदर्भित बेस टेबल में कॉलम के बारे में जानकारी प्रदान नहीं करती है।
और हाँ, दृश्य की वास्तविक परिभाषा की जाँच करने के कई तरीके हैं। लेकिन अगर यह एक बड़ा दृश्य है, तो आप क्रॉस-आइड होने का जोखिम उठाते हैं, बस इसमें शामिल सभी वास्तविक आधार तालिकाओं को चुनने का प्रयास करते हैं।
हालाँकि, एक और तरीका है जिसका उपयोग आप किसी दृश्य द्वारा उपयोग किए गए आधार तालिकाओं और स्तंभों को वापस करने के लिए कर सकते हैं।
आप sys.dm_exec_describe_first_result_set
. का उपयोग कर सकते हैं जब आप दृश्य को क्वेरी करते हैं तो परिणाम सेट के बारे में मेटाडेटा वापस करने के लिए सिस्टम गतिशील प्रबंधन फ़ंक्शन।
जिस तरह से यह काम करता है, आप फ़ंक्शन में एक टी-एसक्यूएल क्वेरी पास करते हैं, और यह परिणाम सेट के बारे में मेटाडेटा लौटाएगा। इस मामले में, आप जिस क्वेरी को फ़ंक्शन में पास करते हैं, वह वह क्वेरी होगी जिसका उपयोग आप दृश्य को क्वेरी करते समय करेंगे।
इस पद्धति का उपयोग करने का एक लाभ यह है कि आपको आधार तालिका और स्तंभ की जानकारी एक अच्छी सूची में मिलती है। प्रत्येक स्तंभ एक अलग पंक्ति में सूचीबद्ध है।
साथ ही, आप अपनी क्वेरी को परिशोधित करके परिणामों को सीमित कर सकते हैं, जिसका अर्थ है कि आप किसी भी अप्रासंगिक कॉलम (यानी जो कॉलम दृश्य में हैं, लेकिन आपकी विशिष्ट क्वेरी के लिए प्रासंगिक नहीं हैं) को समाप्त कर सकते हैं।
उदाहरण
यह कैसे काम करता है, यह दिखाने के लिए यहां एक उदाहरण दिया गया है।
SELECT
CONCAT(
source_server + '.',
source_database + '.',
source_schema + '.',
source_table + '.',
source_column) AS [Source Column],
name AS [View Column],
user_type_name,
system_type_name,
max_length,
[precision],
scale
FROM sys.dm_exec_describe_first_result_set(
N'SELECT * FROM vAllCats',
NULL,
1
);
परिणाम:
+-----------------------+---------------+------------------+--------------------+--------------+-------------+---------+ | Source Column | View Column | user_type_name | system_type_name | max_length | precision | scale | |-----------------------+---------------+------------------+--------------------+--------------+-------------+---------| | Test.dbo.Cats.CatId | CatId | NULL | int | 4 | 10 | 0 | | Test.dbo.Cats.CatName | CatName | NULL | varchar(60) | 60 | 0 | 0 | +-----------------------+---------------+------------------+--------------------+--------------+-------------+---------+
यहां, मैंने CONCAT()
. का उपयोग करने का निर्णय लिया है स्कीमा की कल्पना करना आसान बनाने के लिए कई कॉलम नामों को जोड़ने का कार्य करता है।
इस मामले में, स्रोत कॉलम और व्यू कॉलम” (यानी दृश्य द्वारा लौटाया गया कॉलम) दोनों एक ही नाम साझा करते हैं। ऐसा तब होगा जब व्यू कॉलम के लिए किसी अन्य नाम का उपयोग नहीं करेगा।
ध्यान दें कि हम स्रोत कॉलम, टेबल आदि प्राप्त करने में सक्षम हैं, इसका कारण यह है कि हम 1
का उपयोग करते हैं तीसरे तर्क के रूप में। जब हम इस मान का उपयोग करते हैं, तो प्रत्येक क्वेरी का विश्लेषण किया जाता है जैसे कि उसके पास FOR BROWSE
. है क्वेरी पर विकल्प।
जब व्यू कॉलम एलियासेस का उपयोग करता है
यदि दृश्य स्तंभ उपनामों का उपयोग करता है जो वास्तविक अंतर्निहित स्तंभ नामों से भिन्न हैं, तो यह हमारे परिणामों को प्रतिबिंबित करेगा।
इस उदाहरण में, हम उस दृश्य को क्वेरी करते हैं जो स्तंभ उपनामों का उपयोग करता है।
SELECT
CONCAT(
source_server + '.',
source_database + '.',
source_schema + '.',
source_table + '.',
source_column) AS [Source Column],
name AS [View Column],
user_type_name,
system_type_name,
max_length,
[precision],
scale
FROM sys.dm_exec_describe_first_result_set(
N'SELECT * FROM vAlbums',
NULL,
1
);
परिणाम:
+------------------------------------+---------------+------------------+--------------------+--------------+-------------+---------+ | Source Column | View Column | user_type_name | system_type_name | max_length | precision | scale | |------------------------------------+---------------+------------------+--------------------+--------------+-------------+---------| | Homer.Music.dbo.Artists.ArtistName | Artist | NULL | nvarchar(255) | 510 | 0 | 0 | | Homer.Music.dbo.Albums.AlbumName | Album | NULL | nvarchar(255) | 510 | 0 | 0 | | Homer.Music.dbo.Genres.Genre | Genre | NULL | nvarchar(50) | 100 | 0 | 0 | | Homer.Music.dbo.Artists.ArtistId | ArtistId | NULL | int | 4 | 10 | 0 | | Homer.Music.dbo.Albums.AlbumId | AlbumId | NULL | int | 4 | 10 | 0 | | Homer.Music.dbo.Genres.GenreId | GenreId | NULL | int | 4 | 10 | 0 | +------------------------------------+---------------+------------------+--------------------+--------------+-------------+---------+
यदि हम पहली दो पंक्तियों को देखें, तो हम देख सकते हैं कि अंतर्निहित कॉलम (source_column
द्वारा लौटाए गए हैं) कॉलम), "कॉलम देखें" से अलग हैं (name
. द्वारा लौटाए गए) कॉलम)।
हम यह भी देख सकते हैं कि इस दृश्य के स्रोत कॉलम "होमर" नामक एक लिंक किए गए सर्वर पर स्थित हैं।
एक और ध्यान देने वाली बात यह है कि ब्राउज़ मोड का उपयोग करते समय हम यहां हैं (यानी 1
. के साथ) तीसरे तर्क के रूप में), हमें अन्य कॉलम भी मिलते हैं जो क्वेरी को पूरा करने में शामिल होते हैं (ArtistId
, AlbumId
, और GenreId
), भले ही वे वास्तव में परिणाम सेट में वापस नहीं आए हों।
क्वेरी परिशोधित करें
उन चीजों में से एक जो sys.dm_exec_describe_first_result_set
को अलग करती है sp_help
. जैसी प्रक्रियाओं से और sp_helptext
, क्या यह परिणाम सेट . का वर्णन करता है दृश्य नहीं।
आपको मिलने वाले परिणाम केवल दृश्य पर नहीं, बल्कि आपके द्वारा पास की गई वास्तविक क्वेरी पर निर्भर करेंगे।
यहां पिछले उदाहरण की तरह ही क्वेरी है, इस समय को छोड़कर मैं दृश्य से केवल एक कॉलम का चयन करता हूं (*
का उपयोग करने के बजाय) वाइल्डकार्ड सभी कॉलम चुनने के लिए)।
SELECT
CONCAT(
source_server + '.',
source_database + '.',
source_schema + '.',
source_table + '.',
source_column) AS [Source Column],
name AS [View Column],
user_type_name,
system_type_name,
max_length,
[precision],
scale
FROM sys.dm_exec_describe_first_result_set(
N'SELECT Album FROM vAlbums',
NULL,
1
);
परिणाम:
+----------------------------------+---------------+------------------+--------------------+--------------+-------------+---------+ | Source Column | View Column | user_type_name | system_type_name | max_length | precision | scale | |----------------------------------+---------------+------------------+--------------------+--------------+-------------+---------| | Homer.Music.dbo.Albums.AlbumName | Album | NULL | nvarchar(255) | 510 | 0 | 0 | | Homer.Music.dbo.Artists.ArtistId | ArtistId | NULL | int | 4 | 10 | 0 | | Homer.Music.dbo.Albums.AlbumId | AlbumId | NULL | int | 4 | 10 | 0 | | Homer.Music.dbo.Genres.GenreId | GenreId | NULL | int | 4 | 10 | 0 | +----------------------------------+---------------+------------------+--------------------+--------------+-------------+---------+
तो इस बार, छह के बजाय केवल चार पंक्तियाँ प्राप्त करें।
एकाधिक दृश्यों से अंतर्निहित कॉलम प्राप्त करें
जैसा कि बताया गया है, sys.dm_exec_describe_first_result_set
फ़ंक्शन पूरे परिणाम सेट का वर्णन करता है, न कि केवल एक दृश्य या अन्य वस्तु का।
इसलिए, आप एक ही बार में कई दृश्यों और वस्तुओं से अंतर्निहित स्तंभों की खोज कर सकते हैं।
उदाहरण:
SELECT
CONCAT(
source_server + '.',
source_database + '.',
source_schema + '.',
source_table + '.',
source_column) AS [Source Column],
name AS [View Column],
user_type_name,
system_type_name,
max_length,
[precision],
scale
FROM sys.dm_exec_describe_first_result_set(
N'SELECT * FROM vAllCats c INNER JOIN vAllDogs d ON c.CatName = d.DogName',
NULL,
1
);
परिणाम:
+-----------------------+---------------+------------------+--------------------+--------------+-------------+---------+ | Source Column | View Column | user_type_name | system_type_name | max_length | precision | scale | |-----------------------+---------------+------------------+--------------------+--------------+-------------+---------| | Test.dbo.Cats.CatId | CatId | NULL | int | 4 | 10 | 0 | | Test.dbo.Cats.CatName | CatName | NULL | varchar(60) | 60 | 0 | 0 | | Test.dbo.Dogs.DogId | DogId | NULL | int | 4 | 10 | 0 | | Test.dbo.Dogs.DogName | DogName | NULL | nvarchar(255) | 510 | 0 | 0 | | Test.dbo.Dogs.GoodDog | GoodDog | NULL | bit | 1 | 1 | 0 | +-----------------------+---------------+------------------+--------------------+--------------+-------------+---------+