2009-09-03 7 views
5

क्या कोई यह जानता है कि मैं तालिका में प्राथमिक & विदेशी कुंजी कौन से देख सकता हूं?एसक्यूएल सर्वर 2008: तालिका में प्राथमिक/विदेशी कुंजी का पता लगाएं?

संपादित करें: सभी प्रतिक्रियाओं के लिए धन्यवाद। मैं ऐसा करने के लिए एक एसक्यूएल क्वेरी की तलाश में था। अभी मैं एक उपकरण लिखने के साथ खेल रहा हूं जो मुझे डीबी के सभी टेबल्स सूचीबद्ध कर सकता है और कॉलम दिखा सकता है। मैं यह भी प्रदर्शित करना चाहता हूं कि कौन सी चाबियाँ प्राथमिक कुंजी हैं।

इस तरह मैं टेबल सूचि बाहर पढ़ें:

const string sqlSelectTable = "SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE " + 
             "FROM INFORMATION_SCHEMA.TABLES " + 
             "WHERE TABLE_TYPE = 'BASE TABLE' " + 
             "ORDER BY TABLE_TYPE,TABLE_NAME"; 

और यह कैसे मैं एक स्तंभ के बारे में Infos मिलता है:

const string sqlSelectTable = 
      "SELECT  COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH " + 
      "FROM   INFORMATION_SCHEMA.COLUMNS " + 
      "WHERE  (TABLE_NAME = @TABLE_NAME) " + 
      "ORDER BY ORDINAL_POSITION"; 

मैं बनाने के लिए एक तो भीतरी जुड़ें है चाहेंगे देखें कि कौन से कॉलम प्राथमिक कुंजी हैं?

चीयर्स

उत्तर

11

, तो आप इस क्वेरी का उपयोग कर सकते हैं:

SELECT 
    kc.name, 
    c.NAME 
FROM 
    sys.key_constraints kc 
INNER JOIN 
    sys.index_columns ic ON kc.parent_object_id = ic.object_id 
INNER JOIN 
    sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id 
WHERE 
    kc.type = 'PK' 

और विदेशी कुंजी के लिए, मेरा मानना ​​है कि इस प्रश्न से आपको आवश्यक जानकारी मिलनी चाहिए:

SELECT 
    OBJECT_NAME(parent_object_id) 'Parent table', 
    c.NAME 'Parent column name', 
    OBJECT_NAME(referenced_object_id) 'Referenced table', 
    cref.NAME 'Referenced column name' 
FROM 
    sys.foreign_key_columns fkc 
INNER JOIN 
    sys.columns c 
     ON fkc.parent_column_id = c.column_id 
      AND fkc.parent_object_id = c.object_id 
INNER JOIN 
    sys.columns cref 
     ON fkc.referenced_column_id = cref.column_id 
      AND fkc.referenced_object_id = cref.object_id 

मार्क

+0

नहीं वह काम नहीं करता लिखें। यह आपके द्वारा बनाए गए किसी भी इंडेक्स को लौटाता है। – Craig

+0

@ क्रिएग: क्वेरी # 1 ** केवल ** प्राथमिक कुंजी देता है - क्वेरी # 2 रिटर्न ** केवल ** विदेशी कुंजी - या आपको क्या मिलता है ?? –

3

प्रबंधन स्टूडियो में, तालिका का विस्तार और फिर कॉलम आइटम को विस्तृत। प्राथमिक कुंजी के पास उनके बगल में एक महत्वपूर्ण आइकन है।

विदेशी कुंजी देखने के लिए, बाधाओं का विस्तार करें।

4

देख Querying the SQL Server System Catalog FAQ, How do I find the columns of a primary key for a specified table? और How do I find the columns of a foreign key for a specified table?

संपादित करें: यदि आप इसे प्रोग्राम के रूप में करने के लिए (जो आपके सवाल से स्पष्ट नहीं है) चाहते हैं, कि है।

1

आप के साथ शुरू कर सकते हैं:

SELECT 
    Table_Name as [TableName], 
    Column_Name as [ColumnName], 
    Constraint_Name as [Constraint], 
    Table_Schema as [Schema] 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
ORDER BY 
    [TableName], 
    [ColumnName] 

प्रत्येक मेज पर प्राथमिक कुंजी के लिए (आप तो TableName द्वारा फ़िल्टर कर सकते)

1
SELECT 
OBJECT_NAME(parent_object_id) 'Parent table', 
c.NAME 'Parent column name', 
OBJECT_NAME(referenced_object_id) 'Referenced table', 
cref.NAME 'Referenced column name' 
FROM 
sys.foreign_key_columns fkc 
INNER JOIN 
sys.columns c 
    ON fkc.parent_column_id = c.column_id 
     AND fkc.parent_object_id = c.object_id 
INNER JOIN 
sys.columns cref 
    ON fkc.referenced_column_id = cref.column_id 
     AND fkc.referenced_object_id = cref.object_id where OBJECT_NAME(parent_object_id) = 'tablename' 

आप सभी तालिकाओं के विदेशी कुंजी संबंध प्राप्त करना चाहते हैं को बाहर किसी और where खंड अपने बजाय tablename tablename

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