2009-09-03 12 views
5

Weiß jemand, wie ich die primären & Fremdschlüssel in einer Tabelle sehen kann?SQL Server 2008: Primär/Fremdschlüssel in Tabelle herausfinden?

EDIT: Danke für alle Antworten. Ich suchte nach einer SQL-Abfrage, um das zu tun. Gerade jetzt spiele ich mit dem Schreiben eines Tools, das mir alle Tabellen einer DB auflisten und die Spalten anzeigen kann. Ich möchte auch anzeigen, welche der Schlüssel Primärschlüssel sind.

Dies ist, wie ich die Tabelle Katalog ausgelesenen:

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"; 

Und das ist, wie ich die Infos über eine Säule erhalten:

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

Hätte ich erstellen Inner-Join so Sehen Sie, welche der Spalten Primärschlüssel sind?

Prost

Antwort

11

für den Primärschlüssel auf jedem Tisch, können Sie diese Abfrage verwenden:

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' 

und Für den Fremdschlüssel glaube ich, dass diese Abfrage Sie die notwendigen Informationen erhalten sollte:

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 

Marc

+0

Nein, das nicht funktioniert. Sie gibt alle Indizes zurück, die Sie erstellt haben. – Craig

+0

@Craig: Abfrage # 1 ** nur ** gibt Primärschlüssel zurück - Abfrage # 2 gibt ** nur ** Fremdschlüssel zurück - oder was bekommen Sie ?? –

3

In Management Studio, um die Tabelle erweitern und dann die Spalten Element erweitern. Der Primärschlüssel hat ein Schlüsselsymbol neben ihnen.

Um die Fremdschlüssel anzuzeigen, erweitern Sie den Punkt Einschränkungen.

1

Sie können beginnen mit:

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] 

(Sie können dann filtern, indem Tabellenname)

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' 

Wenn Sie die Fremdschlüsselbeziehung aller Tabellen erhalten wollen ausschließen die where Klausel sonst Ihren Tabellennamen schreibt statt tablename