2009-10-06 1 views

Antwort

61

Dies sollte Ihnen den Einstieg:

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

Wie wäre es

sp_pkeys 'TableName' 
+0

stellar! Ich sehe viel bessere Leistung von diesem als von der Tabelle Joins durch information_schema –

+0

Dies wäre viel handlicher, wenn es eine Tabellenwertfunktion wäre, die Sie aus – 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

auswählen könnten Das ist _way_ besser als die angenommene Antwort, da es den Tabellennamen bereitstellt . –

+0

Es ist auch viel besser, da es das richtige Gehäuse auf den Spalten und PRIMARY KEY hat, so dass es auf einem case sensitive Server funktioniert! –

15

ein hier basierend auf Systemtabellen von SQL 2005 (99% sicher, dass es‘ d Arbeit im Jahr 2008). Dies listet alle PKs für alle benutzerdefinierten Tabellen auf, mit allen Spalten und einigen zusätzlichen Flusen, die entfernt werden könnten. Fügen Sie Parameter hinzu, um eine Tabelle gleichzeitig auszuwählen.

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

Ja, es funktioniert auch in SQL 2008. –

1

Der einfachste Weg ist dies!

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

Dieser Code gibt keine Spalten zurück, die aus einem Primärschlüssel bestehen, versuchen Sie es mit zusammengesetzten Primärschlüsseln. – veljasije

0

Du bist besser dran mit INFORMATION_SCHEMA.KEY_COLUMN_USAGE wie Sie die Taste Bestellinformationen zugreifen können (ORDINAL_POSITION), die sehr wichtig ist, zu wissen.

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

Wenn Sie wissen bereits den Namen des Schlüssels Sie interessiert sind, folgende Arbeiten:

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