2009-09-03 16 views
5

Czy ktoś wie, w jaki sposób mogę sprawdzić, które klucze główne w kluczach & są w tabeli?SQL Server 2008: Dowiedz się klucz podstawowy/zagraniczny w tabeli?

EDYCJA: Dziękuję za wszystkie odpowiedzi. Szukałem Query SQL, aby to zrobić. Teraz bawię się pisząc narzędzie, które może wyświetlić listę wszystkich tabel DB i wyświetlić kolumny. Chciałbym również wyświetlić, który z kluczy jest kluczem podstawowym.

To jak ja odczytać Katalog tabeli:

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

I to jest, jak się dostać na Infos o kolumnę:

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

musiałbym stworzyć łączenie wewnętrzne tak zobaczyć, która z Kolumn jest Kluczem Podstawowym?

Cheers

Odpowiedz

11

Dla klucza podstawowego na każdym stole, można użyć tej kwerendy:

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' 

i dla klucza obcego, wierzę, że to zapytanie powinno dostarczyć niezbędnych informacji:

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

Nie, to nie działa. Zwraca wszystkie utworzone indeksy. – Craig

+0

@Craig: zapytanie # 1 ** tylko ** zwraca klucze podstawowe - zapytanie # 2 zwraca ** tylko ** klucze obce - lub co otrzymujesz? –

3

W Management Studio, rozwiń tabelę, a następnie rozwiń pozycję Kolumny. Główny klucz (klucze) ma ikonę klucza obok nich.

Aby zobaczyć klucze obce, rozwiń element Wiązania.

1

Możesz zacząć:

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] 

(można filtrować następnie przez 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' 

Jeśli chcesz uzyskać klucza obcego relacji wszystkich tabelach wyklucza where klauzula else napisać nazwa_tabeli zamiast tablename

Powiązane problemy