2010-09-15 19 views
49

में सभी स्कीमा की एक सूची कैसे प्राप्त करूं मैं किसी दिए गए SQL सर्वर डेटाबेस में सभी स्कीमा की एक सूची पुनर्प्राप्त करना चाहता हूं। ADO.NET स्कीमा पुनर्प्राप्ति API का उपयोग करके मुझे सभी संग्रहों की एक सूची मिलती है लेकिन 'स्कीमा' के लिए कोई संग्रह नहीं है। मैं 'Tables', 'Procedures' संग्रह (और यदि आवश्यक हो तो अन्य) को पार कर सकता है और अद्वितीय स्कीमा नामों की एक सूची प्राप्त कर सकता है लेकिन क्या एक ही परिणाम प्राप्त करने का एक आसान/छोटा तरीका नहीं है?मैं एक SQL सर्वर डेटाबेस

उदाहरण: मानक 'AdventureWorks' डेटाबेस के लिए मैं निम्नलिखित सूची प्राप्त भी चाहते हैं - dbo,HumanResources,Person,Production,Purchasing,Sales (अन्य मानक schem नाम मैं हटा दिया है db_accessadmin की तरह, db_datareader आदि)

संपादित करें: मैं स्कीमा की सूची प्राप्त कर सकते हैं सिस्टम व्यू से पूछताछ करके - INFORMATION_SCHEMA.SCHEMATA लेकिन पहली पसंद के रूप में स्कीमा एपीआई का उपयोग करना पसंद करेंगे।

उत्तर

54

2005 के लिए और बाद में, ये दोनों आप जो भी खोज रहे हैं उसे देंगे।

SELECT name FROM sys.schemas 
SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA 

2000 के लिए, यह उदाहरण में डेटाबेस की एक सूची दे देंगे।

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA 

"पिछड़े असंगति" है कि में @ Adrift के जवाब का उल्लेख किया।

SQL सर्वर 2000 (और निचले) में, वास्तव में "स्कीमा" नहीं हैं, हालांकि आप समान रूप से नामस्थान के रूप में भूमिकाओं का उपयोग कर सकते हैं। उस स्थिति में, यह निकटतम समकक्ष हो सकता है। आपका डाटाबेस [-

डेटाबेस:

SELECT * FROM sysusers WHERE gid <> 0 
+0

मैंने इसे SQL 2000 सर्वर पर उपयोग करने का प्रयास किया, लेकिन मुझे सभी स्कीमा वापस नहीं मिला। किसी को पता है कि ऐसा क्यों होता है? – evilfish

+0

मेरे पास परीक्षण के लिए 2000 उदाहरण नहीं है - और मैंने सोचा कि * मैं * एक वास्तविक हैंगर-ऑन था! याद रखें कि 2000 में बाद के संस्करणों की तरह वास्तविक "स्कीमा" नहीं हैं, इसलिए आप वास्तव में जो सूची सूचीबद्ध कर रहे हैं वह भूमिका है। केवल 'चयन करें * sysusers से चुनें' और देखें कि क्या आप पहचानकर्ता देख रहे हैं जिन्हें आप ढूंढ रहे हैं। – harpo

+0

मैंने इसे पढ़ा है और चयन * जानकारी से INCHMATION_SCHEMA.SCHEMATA वास्तव में उपयोग किए जाने वाले स्रोतों का उपयोग करने का एक अच्छा विचार नहीं है। मास्टर तालिका संग्रहीत प्रक्रिया "sp_databases" निष्पादित करने के लिए एक बेहतर तरीका है। यह 2000 और 2005 दोनों (दोनों का परीक्षण) के लिए काम करता है, और मेरे मामले में हर बार सही परिणाम लौटाता है। – evilfish

8

यहां इस क्वेरी का प्रयास करें:

SELECT * FROM sys.schemas 

यह सभी डेटाबेस आप में इस पर अमल में स्कीमा को परिभाषित करता है के लिए आप नाम और schema_id दे देंगे

मैं वास्तव में नहीं जानते कि तुम से क्या मतलब है। "स्कीमा एपीआई" से पूछताछ - इन sys. कैटलॉग दृश्य (sys स्कीमा में) डेटाबेस में उन डेटाबेस में डेटाबेस और ऑब्जेक्ट्स के बारे में किसी भी सिस्टम की जानकारी के लिए आपकी सर्वश्रेष्ठ शर्त है।

SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA 

मैं INFORMATION_SCHEMA विचारों की क्वेरी विश्वास के रूप में वे आप अंतर्निहित sys तालिकाओं में परिवर्तन से बचाने की सिफारिश की है:

+0

ठंडा। आपकी क्वेरी भी चाल चलती है। आश्चर्य है कि अधिक कुशल क्या है - पूछताछ sys.schema या INFORMATION_SCHEMA.SCHEMATA दृश्य? 'स्कीमा एपीआई' से मेरा मतलब मानक SqlConnection.GetSchema 'स्पष्ट रूप से एक क्वेरी जारी करने के बजाय कॉल करता है। – alwayslearning

+2

"sys।" कैटलॉग दृश्य शायद एक टैड अधिक कुशल और तेज़ हैं, लेकिन वे SQL सर्वर विशिष्ट हैं। INFORMATION_SCHEMA विचार डेटाबेस मेटाडेटा से पूछताछ के लिए डेटाबेस-अज्ञेय एएनएसआई मानक हैं, लेकिन जैसा कि उन्हें मानक समिति द्वारा डिजाइन किया गया था ...... आपको विचार मिलता है ..... –

+0

संबंधित नहीं हो सकता है, मैंने कोशिश की [यह] http://stackoverflow.com/a/175450/2218697) स्रोत और लक्ष्य डेटाबेस की तुलना करने के लिए 'पीके, एफके, डी, सी, वी, यूक्यू' आदि के लिए कई चुनिंदा वक्तव्यों के साथ, लेकिन फिर मैंने पाया [यह] (http: //stackoverflow.com/a/685073/2218697) VS में सुविधा है, लेकिन क्या पूर्ण स्रोत और लक्ष्य डेटाबेस की तुलना करने के लिए 'sql क्वेरी' नहीं है? विडंबना को इंगित करने के लिए – stom

4

तुम भी INFORMATION_SCHEMA.SCHEMATA दृश्य क्वेरी कर सकते हैं। से एसक्यूएल सर्वर 2008 R2 सहायता:

सूचना स्कीमा विचारों एसक्यूएल सर्वर मेटाडाटा के एक आंतरिक, सिस्टम टेबल स्वतंत्र दृश्य प्रदान करते हैं। सूचना स्कीमा दृश्य अनुप्रयोगों को सही ढंग से काम करने के लिए सक्षम करते हैं हालांकि महत्वपूर्ण परिवर्तन अंतर्निहित सिस्टम तालिकाओं में किए गए हैं। जानकारी स्कीमा दृश्यों में SQL सर्वर में INFORMATION_SCHEMA के लिए मानक परिभाषा का अनुपालन करता है।

विडंबना यह है कि इस तुरंत इस टिप्पणी से पहले किया जाता है:

कुछ परिवर्तन जानकारी स्कीमा विचारों कि पश्चगामी संगतता को तोड़ने के लिए बनाया गया है। इन परिवर्तनों को विशिष्ट दृश्यों के विषयों में वर्णित किया गया है।

+1

+1, मुझे एक अच्छा हंसी दी। – codenheim

4
select s.name + '.' + ao.name,s.name from sys.all_objects ao 
inner join sys.schemas s 
on s.schema_id = ao.schema_id 
where ao.type='u' 
0

आप Sql सर्वर प्रबंधन स्टूडियो का उपयोग कर रहे हैं, तो आप, सभी स्कीमा की एक सूची प्राप्त कर सकते हैं अपने खुद के स्कीमा बना सकते हैं या करने के लिए ब्राउज़ कर पहले से मौजूद किसी को दूर ] - सुरक्षा - स्कीमा

संबंधित मुद्दे