2010-08-23 7 views
5

डेटाबेस को देखते हुए, मैं प्रत्येक तालिका की प्राथमिक कुंजी के साथ टेबल्स की एक सूची कैसे प्राप्त कर सकता हूं?मैं केवल सी # का उपयोग कर प्राथमिक कुंजी के साथ SQL सर्वर डेटाबेस में तालिकाओं की सूची कैसे प्राप्त कर सकता हूं?

धन्यवाद।

संपादित करें: यह एक कोड जनरेशन टूल के लिए है जिसे मैं बना रहा हूं, मुझे किसी भी तरह से सी # का उपयोग करके SQL स्क्रिप्ट चलाने की आवश्यकता है। प्राथमिक कुंजी के बिना

SELECT ta.name TableName, ind.name IndexName 
from sys.tables ta 
    left outer join sys.indexes ind 
    on ind.object_id = ta.object_id 
    and ind.is_primary_key = 1 

टेबल्स IndexName अशक्त करने के लिए सेट है:

+0

संभावित डुप्लिकेट [मैं TSQL का उपयोग कर डेटाबेस में सभी तालिकाओं की सूची कैसे प्राप्त करूं?] (Http://stackoverflow.com/questions/175415/how-do-i-get-list-of-all-tables -इन-ए-डेटाबेस-उपयोग-tsql) –

+2

डुप्लिकेट नहीं। मुझे सी # कोड चाहिए, टीएसक्यूएल नहीं। एक बड़ा अंतर है। –

+4

@ सर्जीओ: सी # में ऐसा करने का तरीका एक टीएसक्यूएल स्क्रिप्ट निष्पादित करना होगा (उदा। एसपी)। – Brian

उत्तर

6

यह स्वयं द्वारा कोई टी-एसक्यूएल का उपयोग नहीं करता है। यह इसे अपने आप उत्पन्न करता है लेकिन सटीक, लघु टी-एसक्यूएल का उपयोग करने के समान प्रभावी नहीं होगा जो समान जानकारी प्राप्त करेगा।

using Microsoft.SqlServer.Management.Common; 
using Microsoft.SqlServer.Management.Smo; 

public class LoadStuff 
{ 
    string mDatabaseConnectionString = "Something"; 
    ... 
    public void LoadDatabase(string tDatabaseName) 
    { 
     using (var vSqlConnection = new SqlConnection(mDatabaseConnectionString)) 
     { 
      var vConnection = new ServerConnection(vSqlConnection); 
      var vServer = new Server(vConnection); 
      var vDatabase = vServer.Databases[tDatabaseName]; 
      var vTables = vDatabase.Tables; 
     } 
    } 
} 

संग्रह में वस्तुओं "vTables" से प्रत्येक कि डेटाबेस vDatabaseName कहा जाता है में एक टेबल के लिए एक परिभाषा हो जाएगा।

उस तालिका में स्तंभों का संग्रह होगा, और प्राथमिक कुंजी प्रत्येक तालिका की "कॉलम" संपत्ति के माध्यम से लूपिंग पाई जा सकती है। प्राथमिक कुंजी में किसी भी कॉलम की संपत्ति "InPrimaryKey" को चिह्नित किया जाएगा।

इसके अलावा आपको उपयोग करने वाले ब्लॉक के अंत से पहले विभिन्न वस्तुओं से सभी जानकारी प्राप्त करनी होगी। मैं मिनी क्लास बनाने के बारे में गया था, जिसमें पूरी प्रक्रिया पूरी होने के बाद मुझे आवश्यक जानकारी थी, लेकिन आप शायद कोड पीढ़ी से कोड को थूक सकते हैं।

+1

यह उस पर निर्भर करता है जिसका मतलब है "कोई टी-एसक्यूएल का उपयोग नहीं करता"। कोड में कोई टी-एसक्यूएल नहीं है, लेकिन संभवतः यह अन्य उत्तरों की तुलना में बहुत अधिक टी-एसक्यूएल चला रहा है जो हमें एक प्रश्न में जो कुछ भी चाहिए, उसे प्राप्त करें। – stevemegson

+1

एसएमओ आपके लिए आवश्यक टी-एसक्यूएल कोड उत्पन्न और चलाएगा, और ऐप डेवलपर को वास्तविक कोड, डेटाबेस संस्करण परिवर्तनों, एसक्यूएल इंजेक्शन आदि का प्रबंधन करने की आवश्यकता नहीं है। एक बार जब आप डेटा निकालने के लिए लूप को टॉस करते हैं इसकी आवश्यकता है, आप एक ही परिणाम के साथ समाप्त हो जाते हैं ... और यदि * आवश्यकताएं * "सी # कोड में कोई टी-एसक्यूएल" नहीं हैं, तो यही आपको चाहिए। –

+0

हाँ मैं इसे ले रहा था क्योंकि वह ऐसा करने के लिए टी एसक्यूएल का उपयोग नहीं कर सका। या कम से कम उसे ऐसा करने के लिए जितना संभव हो उतना सी # उपयोग करना होगा। यह टी एसक्यूएल का उपयोग करता है लेकिन इस कोड स्निपेट का उपयोग करने वाला व्यक्ति केवल कोड का उपयोग कर रहा है, कोई कमांड स्ट्रिंग या कुछ भी नहीं। – Rangoric

1

यहाँ एक शुरुआत (SQL 2005 और ऊपर) है।

लेकिन यह केवल प्राथमिक कुंजी का नाम सूचीबद्ध करता है। क्या आपको कुंजी में कॉलम की सूची चाहिए?

- जोड़ा ----------------

यहाँ एक उपयोगिता मैं एक बार लिखा था का एक हिस्सा है। हैकिंग कि, निम्नलिखित केवल एक स्तंभ के प्राथमिक कुंजी के साथ सभी (और केवल) टेबल सूची जाएगा

SELECT ta.name TableName, ind.name IndexName, indcol.key_ordinal IndexColumnOrder, col.name ColumnName 
from sys.tables ta 
    left outer join sys.indexes ind 
    on ind.object_id = ta.object_id 
    and ind.is_primary_key = 1 
    left outer join sys.index_columns indcol 
    on indcol.object_id = ta.object_id 
    and indcol.index_id = ind.index_id 
    left outer join sys.columns col 
    on col.object_id = ta.object_id 
    and col.column_id = indcol.column_id 
order by 
    ta.Name 
    ,indcol.key_ordinal 

:

SELECT ta.name TableName, max(col.name) ColumnName 
from sys.tables ta 
    inner join sys.indexes ind 
    on ind.object_id = ta.object_id 
    and ind.is_primary_key = 1 
    inner join sys.index_columns indcol 
    on indcol.object_id = ta.object_id 
    and indcol.index_id = ind.index_id 
    inner join sys.columns col 
    on col.object_id = ta.object_id 
    and col.column_id = indcol.column_id 
group by ta.name 
having count(*) = 1 
order by ta.Name 
यह सभी मौजूदा प्राथमिक कुंजी के क्रम में सभी तालिकाओं और कॉलम सूची जाएगा

इसे C# (मेरे फोर्टे नहीं) में बदलने के लिए, आपको या तो इसे संग्रहीत प्रक्रिया बनाने में सक्षम होना चाहिए, या केवल अपने कोड के भीतर से क्वेरी बनाना और सबमिट करना चाहिए।

select 
    t.Table_Name, 
    tc.Constraint_Name, 
    ccu.Column_Name 
from 
    information_schema.tables t 
    left join information_schema.table_constraints tc 
     on tc.Table_Catalog = t.Table_Catalog 
     and tc.Table_Name = t.Table_Name 
     and tc.Constraint_Type = 'PRIMARY KEY' 
    left join information_schema.constraint_column_usage ccu 
     on ccu.Table_Catalog = tc.Table_Catalog 
     and ccu.Table_Name = tc.Table_Name 
     and ccu.Constraint_Schema = tc.Constraint_Schema 
     and ccu.Constraint_Name = tc.Constraint_Name 
order by 
    t.Table_Name, 
    tc.Constraint_Name, 
    ccu.Column_Name 

हो जाएगा ताकि सूची टेबल, उनके प्राथमिक कुंजी की कमी है, और उन बाधाओं में कॉलम:

+0

कल्पना करें कि व्यक्ति तालिका में प्राथमिक कुंजी के रूप में आईडी कॉलम हैं। मुझे उस कॉलम का सही नाम चाहिए। मुझे किसी भी तरह से सी # कोड के अंदर इसे आमंत्रित करने की आवश्यकता है। मैं यह कैसे कर सकता हूँ? –

+0

क्या आप नाम (आईडी, प्रकार) के बजाय क्रमिक स्थिति (0,1) द्वारा पीके कॉलम का संदर्भ ले सकते हैं? – Beth

3

यहाँ एक ही जवाब है। ध्यान दें कि यदि प्राथमिक कुंजी में एकाधिक कॉलम हैं, तो उस कॉलम के लिए कई प्रविष्टियां होंगी। यह भी ध्यान रखें कि यह क्वेरी भी विचारों को वापस लाती है।

+0

मुझे सी # की जरूरत है, टीएसक्यूएल नहीं। –

+0

उपयोगकर्ता TSQL आदेश नहीं चला रहा है; आपका सी # कोड है। SQL कनेक्शन बनाने और C# में SQL कमांड के रूप में इसका उपयोग करने पर आपका आपत्ति क्या है? यहां कोई एसक्यूएल इंजेक्शन संभावना नहीं है। –

0

.. आप डेटाबेस के आधार पर निष्पादित करने के लिए T-SQL SqlCommand ऑब्जेक्ट का उपयोग

और अन्य भाषाओं सी # में कई उदाहरण के साथ यहाँ प्रलेखित: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx

या आप CLR बनाया का उपयोग करके सीधे मतलब है एसक्यूएल सर्वर में?

+0

मेरे पास अंतिम उपयोगकर्ता TSQL कमांड नहीं चला सकता है, मुझे शुद्ध सी # का उपयोग करने की आवश्यकता है। –

+0

क्या आप SQL सर्वर और डॉटनेट फ्रेमवर्क के बीच संबंधों को समझते हैं? SQLCommand मौलिक है - किसी भी डॉटनेट एप्लिकेशन/फ़्रेमवर्क और SQL सर्वर के बीच सभी इंटरैक्शन के बारे में उस ऑब्जेक्ट के माध्यम से होता है ... कृपया बताएं कि आप किसी डेटाबेस के साथ संवाद करने के लिए किसी एप्लिकेशन की कल्पना कैसे करते हैं !!!!!! मैंने तय किया है कि पहले से ही अपना 'उत्पाद' – Adrian

+0

नहीं खरीदना बहुत संभव है। एक कस्टम एकत्रण की बात निष्पादित करने योग्य नहीं है, हालांकि एक एमएस बनाई गई लाइब्रेरी है जो पहले से ही डेटाबेस जानकारी प्राप्त करती है। आप किसी भी टी-एसक्यूएल को लिखने के बिना डेटाबेस के बारे में किसी भी गैर-डेटा जानकारी के बारे में जान सकते हैं। – Rangoric