2009-10-06 10 views

Odpowiedz

61

To powinno Ci zacząć:

SELECT * 
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc 
     JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu ON tc.CONSTRAINT_NAME = ccu.Constraint_name 
    WHERE tc.CONSTRAINT_TYPE = 'Primary Key' 
32

Jak o

sp_pkeys 'TableName' 
+0

odjazdowy! Dostrzegam o wiele lepszą wydajność niż z połączenia tabeli poprzez info_schema –

+0

Byłoby znacznie wygodniej, gdyby była to funkcja o wartości tabelarycznej, którą można wybrać z – xr280xr

3
exec [sys].[sp_primary_keys_rowset] @table_name= 'TableName' 
17
SELECT ccu.COLUMN_NAME, ccu.CONSTRAINT_NAME 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc 
    INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS ccu 
     ON tc.CONSTRAINT_NAME = ccu.CONSTRAINT_NAME 
WHERE tc.TABLE_CATALOG = 'Your_Catalog' -- replace with your catalog 
    AND tc.TABLE_SCHEMA = 'dbo'   -- replace with your schema 
    AND tc.TABLE_NAME = 'Your_Table'  -- replace with your table name 
    AND tc.CONSTRAINT_TYPE = 'PRIMARY KEY' 
+1

To jest _way_ lepsze niż akceptowana odpowiedź, ponieważ zawiera nazwę tabeli . –

+0

Jest również o wiele lepszy, ponieważ ma poprawną obudowę na kolumnach i kluczu podstawowym, więc działa na serwerze z rozróżnianiem wielkich i małych liter! –

15

Oto jeden oparty na tabelach systemowych z SQL 2005 (99% pewien, że” d pracować w 2008 r.). Spowoduje to wyświetlenie wszystkich PK dla wszystkich tabel zdefiniowanych przez użytkownika, ze wszystkimi kolumnami i pewnym dodatkiem kłaczków, które można usunąć. Dodaj parametry, aby wybrać tabelę na raz.

SELECT 
    schema_name(ta.schema_id) SchemaName 
    ,ta.name TableName 
    ,ind.name 
    ,indcol.key_ordinal Ord 
    ,col.name ColumnName 
    ,ind.type_desc 
    ,ind.fill_factor 
from sys.tables ta 
    inner join sys.indexes ind 
    on ind.object_id = ta.object_id 
    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 
where ind.is_primary_key = 1 
order by 
    ta.name 
    ,indcol.key_ordinal 
+1

Tak, działa również w SQL 2008. –

1

Najprostszy sposób to!

select object_id from sys.objects 
where parent_object_id = OBJECT_ID(N'FACounty') 
and [type] = N'PK' 
+0

Ten kod nie zwraca kolumn zawierających klucz podstawowy, spróbuj na złożonych kluczy podstawowych. – veljasije

0

Jesteś lepiej wyłączyć za pomocą INFORMATION_SCHEMA.KEY_COLUMN_USAGE jak można uzyskać dostęp do kluczowych informacji Zamawianie (ORDINAL_POSITION), który jest bardzo ważne, aby wiedzieć.

SELECT kcu.* 
    FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu 
    INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc 
    ON tc.TABLE_NAME = kcu.TABLE_NAME 
    AND tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME 
ORDER BY tc.TABLE_NAME 
    ,tc.CONSTRAINT_NAME 
    ,kcu.ORDINAL_POSITION 
0

Jeśli już znasz nazwę klucza, który Cię interesuje, następujących prac:

-- Assuming you have schema "Example" and the primary key name is "PK_Item" 
-- Notice that name of table is irrelevant here but is "Foobar" here 
IF (OBJECT_ID('Example.PK_ITEM') IS NULL) 
BEGIN 
    ALTER TABLE [Example].Foobar ADD CONSTRAINT 
    PK_Item PRIMARY KEY ... 
END