web-dev-qa-db-fra.com

Déterminer la clé primaire d'une table à l'aide de TSQL

Je voudrais déterminer la clé primaire d'une table en utilisant TSQL (procédure stockée ou table système, c'est bien). Existe-t-il un tel mécanisme dans SQL Server (2005 ou 2008)?

47
rein

Cela devrait vous aider à démarrer:

SELECT *
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
        JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu ON tc.CONSTRAINT_NAME = ccu.Constraint_name
    WHERE tc.TABLE_NAME = 'TableName' and tc.CONSTRAINT_TYPE = 'Primary Key'
69
Stuart Ainsworth

Que diriez-vous

sp_pkeys 'TableName'
37
Jason Punyon

En voici une qui repose sur les tables système de SQL 2005 (99% d’assurance que cela fonctionnerait en 2008). Ceci listera toutes les PK de toutes les tables définies par l'utilisateur, avec toutes les colonnes et quelques données supplémentaires qui pourraient être supprimées. Ajoutez des paramètres pour choisir une table à la fois.

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
19
Philip Kelley
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'
17
LukeH
EXEC sp_Pkeys @tableName
4
chugh97
exec [sys].[sp_primary_keys_rowset] @table_name= 'TableName'
3
Jacob G

Le moyen le plus simple est-ce!

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

Vous feriez mieux d'utiliser INFORMATION_SCHEMA.KEY_COLUMN_USAGE car vous pouvez accéder aux informations de commande de clé (ORDINAL_POSITION), qu'il est très important de connaître.

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
1
sqlconsumer.net

Si vous connaissez déjà le nom de la clé qui vous intéresse, procédez comme suit:

-- 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
0
Pasi Savolainen