2016-03-29 8 views
5

W SQL Server 2008 chcę uzyskać listę kolumn (nazw kolumn), które obejmuje klucz podstawowy.Uzyskiwanie listy kolumn dla PK

Próbowałem

SELECT * 
FROM sys.key_constraints 
LEFT JOIN sysconstraints ON (sys.key_constraints.object_id = sysconstraints.constid) 
WHERE 
    type = 'PK' 
    AND parent_object_id = OBJECT_ID('dbo.permissioncache'); 

ta zwraca klucz podstawowy i kilka innych wartości, ale nie pełną listę kolumn PK.

Do jakich innych stołów będę musiał się przyłączyć?

Odpowiedz

4

Spróbuj w ten sposób

INFORMATION_SCHEMA metoda

SELECT TC.TABLE_NAME, 
     COLUMN_NAME, 
     TC.CONSTRAINT_NAME 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc 
     INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cc 
       ON cc.Constraint_Name = tc.Constraint_Name 
        AND cc.Table_Name = tc.Table_Name 
WHERE Constraint_Type = 'PRIMARY KEY' 
     AND cc.Table_Name = 'Yourtable' 

Sys opcji,

SELECT t.name AS TABLE_NAME, 
     c.name AS COLUMN_NAME, 
     kc.name AS CONSTRAINT_NAME 
FROM sys.key_constraints AS kc 
     JOIN sys.tables AS t 
     ON t.object_id = kc.parent_object_id 
     JOIN sys.index_columns AS ic 
     ON ic.object_id = t.object_id 
      AND ic.index_id = kc.unique_index_id 
     JOIN sys.columns AS c 
     ON c.object_id = t.object_id 
      AND c.column_id = ic.column_id 
WHERE kc.type = 'PK' 
     AND t.name = 'Yourtable' 
2
SELECT Col.Column_Name 
from 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab 
    INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col 
ON 
    Col.Constraint_Name = Tab.Constraint_Name 
    AND Col.Table_Name = Tab.Table_Name 
WHERE Constraint_Type = 'PRIMARY KEY' 

i jeśli chcesz uzyskać listę wszystkich kolumn klucza głównego w bazie danych, a następnie

USE myDB; 
GO 

SELECT i.name AS IndexName, 
     OBJECT_NAME(ic.OBJECT_ID) AS TableName, 
     COL_NAME(ic.OBJECT_ID,ic.column_id) AS ColumnName 
FROM sys.indexes AS i 
INNER JOIN sys.index_columns AS ic ON i.OBJECT_ID = ic.OBJECT_ID 
     AND i.index_id = ic.index_id 
WHERE i.is_primary_key = 1 
+0

Dlaczego nauczanie starego stylu, niejawne dołączenia w 2016 roku? – jarlh

+0

@jarlh: - Mój zły, dzięki za wskazanie. Zaktualizowano to! –

0

użyj sprzężenia wewnętrznego, nie lewe sprzężenie zewnętrzne, jeśli zastosujesz lewe sprzężenie zewnętrzne, to wszystkie wiersze od lewej tabeli.