क्या कोई तरीका है जो AD AD के उपयोग से दृश्य परिभाषा को पुनः प्राप्त करने का एक तरीका है?


89

मैं सफलतापूर्वक ADO कनेक्शन का उपयोग करते हुए SQL सर्वर पर होस्ट किए गए डेटाबेस से स्तंभ परिभाषा निकाल रहा हूं OpenSchema() अपने विभिन्न अवतारों में कॉल रहा हूं, ताकि मैं उन तालिकाओं को दूसरे SQL डेटाबेस में प्रोग्रामेटिक रूप से पुन: बना सकूं। अब तक सब ठीक है।

उपरोक्त तालिकाओं के साथ मुख्य इंटरैक्शन कई दृश्यों का उपयोग करके होता है; जबकिOpenSchema() वह किसी तालिका के लिए स्तंभ परिभाषाएँ लौटाता है, उसी तरह से दृश्य के लिए स्तंभ परिभाषाएँ वापस करने में सक्षम होता है, तो जानकारी का एक महत्वपूर्ण बिट अनुपलब्ध है - कौन सी तालिका और अंतर्निहित तालिका में स्तंभ दृश्य मानचित्रों में स्तंभ।

मैंने ADOX कैटलॉग व्यू का उपयोग करके दृश्य बनाने के लिए उपयोग किए गए SQL कमांड का उपयोग करने की कोशिश की, लेकिन ऐसा प्रतीत होता है कि SQL सर्वर के लिए OLEDB ड्राइवर जो हम उपयोग कर रहे हैं वह इस कार्यक्षमता का समर्थन नहीं करता है।

क्या ADO के माध्यम से व्यू कॉन्फिगरेशन के लिए इस जानकारी को प्राप्त करने का कोई तरीका है, या तो यह बताता है कि "तालिका Z में कॉलम के कॉलम" या दृश्य बनाने के लिए उपयोग किए जाने वाले वास्तविक SQL कमांड के रूप में है?

जवाबों:


158

SQL सर्वर का कौन सा संस्करण?

SQL सर्वर 2005 और बाद के लिए, आप इस तरह से दृश्य बनाने के लिए उपयोग की जाने वाली SQL स्क्रिप्ट प्राप्त कर सकते हैं:

select definition
from sys.objects     o
join sys.sql_modules m on m.object_id = o.object_id
where o.object_id = object_id( 'dbo.MyView')
  and o.type      = 'V'

यह दृश्य बनाने / बदलने के लिए उपयोग की जाने वाली स्क्रिप्ट वाली एकल पंक्ति देता है।

तालिका के अन्य स्तंभ उस समय के विकल्पों के बारे में बताते हैं जिस समय दृश्य संकलित किया गया था।

चेतावनियां

  • यदि दृश्य को पिछली बार ALTER VIEW के साथ संशोधित किया गया था, तो स्क्रिप्ट CREATE VIEW कथन के बजाय ALTER VIEW कथन होगा।

  • स्क्रिप्ट उस नाम को दर्शाती है जैसे इसे बनाया गया था। केवल तभी अपडेट किया जाता है जब आप ALTER VIEW को निष्पादित करते हैं, या क्रिएट व्यू के साथ व्यू को ड्रॉप और रीक्रिएट करते हैं। यदि दृश्य का नाम बदल दिया गया है (जैसे, के माध्यम से sp_rename) या स्वामित्व को एक अलग स्कीमा में स्थानांतरित कर दिया गया है, तो आपको जो स्क्रिप्ट मिलेगी वह मूल क्रिएट / अलार्म दृश्य विवरण को दर्शाएगी: यह वस्तुओं को वर्तमान नाम को प्रतिबिंबित नहीं करेगा।

  • कुछ उपकरण आउटपुट को छोटा करते हैं। उदाहरण के लिए, MS-SQL कमांड लाइन टूल sqlcmd.exe 255 चार्ट पर डेटा को काट देता है। आप चार्ट के -y Nसाथ परिणाम प्राप्त करने के लिए पैरामीटर पास कर सकते हैं N


8
उत्तर से एसक्यूएल क्वेरी को थोड़ा सरल किया जा सकता है:select m.definition from sys.sql_modules m where m.object_id = object_id('dbo.MyView', 'V')
इवान

8
एक और चेतावनी है कि परिभाषा को देखने में सक्षम होने के लिए आपको सही अनुमति की आवश्यकता है। मुझे उनके लिए NULL हो रहा है।
rveach

1
@schlamar, यदि आप देख रहे हैं कि पहले 255 अक्षर हैं, तो आप परिणाम कॉलम को गलत तरीके से परिवर्तित कर रहे हैं। sys.sql_modulesकॉलम को परिभाषित करने के लिए स्कीमा इस प्रकार है:definition nvarchar(max) SQL text that defines this module. NULL = Encrypted.
निकोलस केरी

1
@schlamar, आप यह भी नोट कर सकते हैं कि यदि आप SSMS / क्वेरी एनालाइज़र का उपयोग कर रहे हैं, यदि आप क्वेरी परिणामों को पाठ (ग्रिड के बजाय) के रूप में चला रहे हैं, तो डिफ़ॉल्ट रूप से, [n][var]charडेटा को 256 वर्णों में काट दिया जाता है। आप इसे मेनू पर Query..Query Options...& mdash के माध्यम से बदल सकते हैं ; आगामी मोडल डायलॉग से, Results>Textबायीं ओर ट्री कंट्रोल में नोड तक नीचे ड्रिल करें ।
निकोलस कैरी

1
मैं MS-SQL कमांड लाइन टूल (sqlcmd.exe) का उपयोग करता हूं। यह डेटा को छोटा भी करता है। अधिक डेटा प्राप्त करने के लिए मुझे पैरामीटर-एन पास करना पड़ा (वास्तव में एमएस?)। इसलिए मुझे सही दिशा में इशारा करने के लिए धन्यवाद।
श्लमर

24

Microsoft ने दृश्य परिभाषा प्राप्त करने के लिए निम्नलिखित विधियाँ सूचीबद्ध कीं: http://technet.microsoft.com/en-us/library/ms175067.aspx


USE AdventureWorks2012;
GO
SELECT definition, uses_ansi_nulls, uses_quoted_identifier, is_schema_bound
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('HumanResources.vEmployee'); 
GO

USE AdventureWorks2012; 
GO
SELECT OBJECT_DEFINITION (OBJECT_ID('HumanResources.vEmployee')) 
AS ObjectDefinition; 
GO

EXEC sp_helptext 'HumanResources.vEmployee';

12

SQL 2000 के उपयोगकर्ताओं के लिए, वास्तविक कमांड जो यह जानकारी प्रदान करेगी:

select c.text
from sysobjects     o
join syscomments    c on c.id = o.id
where o.name = '<view_name_here>'
  and o.type      = 'V'

यह संस्करण 4,000 वर्णों के कई रिकॉर्डों में टूटे हुए दृश्य को लौटाता है। (एसक्यूएल सर्वर 2014 में परीक्षण किया गया।)
बेन


3

आप नीचे क्वेरी के माध्यम से तालिका / दृश्य विवरण प्राप्त कर सकते हैं।

तालिका के लिए: sp_help table_name देखने के लिए: sp_help view_name


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.