56 votes

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

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

79voto

Stuart Ainsworth Points 7529

Cela devrait vous permettre de commencer :

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'

0 votes

ON tc.CONSTRAINT_NAME = ccu.CONSTRAINT_NAME AND tc.CONSTRAINT_SCHEMA = ccu.CONSTRAINT_SCHEMA pour les schémas multiples

49voto

Jason Punyon Points 21244

Et si

sp_pkeys 'TableName'

0 votes

Stellaire ! Je constate que les performances sont bien meilleures avec cette méthode qu'avec les jointures de tables via information_schema.

1 votes

Ce serait beaucoup plus pratique s'il s'agissait d'une fonction à valeur de tableau que l'on peut sélectionner.

0 votes

On ne peut rien faire avec le résultat car ce n'est pas une fonction.

22voto

Philip Kelley Points 19032

En voici un basé sur les tables système de SQL 2005 (99% sûr qu'il fonctionnerait en 2008). Cela va lister tous les PKs pour toutes les tables définies par l'utilisateur, avec toutes les colonnes et quelques informations supplémentaires qui pourraient être supprimées. Ajoutez des paramètres pour sélectionner 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

21voto

LukeH Points 110965
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 votes

C'est chemin est meilleure que la réponse acceptée, car elle fournit le nom de la table.

0 votes

Il est également bien meilleur car il utilise la casse correcte des colonnes et PRIMARY KEY, ce qui lui permet de fonctionner sur un serveur sensible à la casse !

4voto

chugh97 Points 2873
EXEC sp_Pkeys @tableName

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X