Question

L'utilisation de ce SQL sur SQL Server 2005

SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_NAME = @TableName
  AND COLUMN_NAME=@ColumnName

Je reçois les clés primaires et les clés étrangères.

Comment puis-je obtenir seulement les clés étrangères? Comment puis-je voir si une contrainte est un primaire ou une clé étrangère?

Merci

Était-ce utile?

La solution 2

J'utilisé l'instruction SQL suivante avec SQL Server 2005 pour obtenir les noms par contrainte de clé primaire:

SELECT Constraint_Name 
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 
WHERE UNIQUE_CONSTRAINT_NAME = 
   (SELECT CONSTRAINT_NAME 
    FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
    WHERE TABLE_NAME = @TableName AND COLUMN_NAME = @ColumnName)

Pour obtenir le nom Constraint par Etrangère Key:

SELECT CONSTRAINT_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_NAME = @TableName AND COLUMN_NAME = @ColumnName

Pour la table et de la clé étrangère par Nom Champ Contrainte:

SELECT TABLE_NAME, COLUMN_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE CONSTRAINT_NAME = @ConstraintName

Pour la Table clé primaire et sur le terrain par Nom Constraint:

SELECT TABLE_NAME, COLUMN_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE CONSTRAINT_NAME = 
    (SELECT UNIQUE_CONSTRAINT_NAME 
     FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 
     WHERE CONSTRAINT_NAME = @ConstraintName)

Autres conseils

trouvé une solution beaucoup plus élégante ici

code ajouté ci-dessous pour être complet, mais tout le crédit va à Pinal Dave

SELECT f.name AS ForeignKey,
   OBJECT_NAME(f.parent_object_id) AS TableName,
   COL_NAME(fc.parent_object_id, 
   fc.parent_column_id) AS ColumnName,
   OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,
   COL_NAME(fc.referenced_object_id, 
   fc.referenced_column_id) AS ReferenceColumnName
FROM sys.foreign_keys AS f
LEFT JOIN sys.foreign_key_columns AS fc
   ON f.OBJECT_ID = fc.constraint_object_id

Et si vous voulez juste les clés primaires ...

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

a ajouté comme une réponse supplémentaire, car il est si loin de ma précédente:)

Cela dépend de votre SGBD, mais une contrainte doit avoir la table cible et de la colonne quelque part.

Si elle est une contrainte de clé étrangère, la table cible sera différente de la table en cours. Essayez

select *

au lieu de

select constraint_name

pour voir toutes les colonnes magiques que vous pouvez travailler avec.

SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName
  AND COLUMN_NAME=@ColumnName
  AND REFERENCED_COLUMN_NAME IS NOT NULL

Ce n'est pas la plus élégante des solutions, mais MS SQL Server utilise la convention de nommage préfixe PK et FK pour les clés pour que vous puissiez utiliser quelque chose ...

SELECT CONSTRAINT_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_NAME = @TableName
AND LEFT(CONSTRAINT_NAME,2) = 'FK'

Si tel est votre SGBD:)

EDIT

Quand j'ai essayé la réponse par Quassnoi Je suis un « nom de colonne non valide « REFERENCED_COLUMN_NAME ». » erreur.

J'utilise quelque chose comme ça. Il fonctionne dans SQL Server 2000 ainsi.

select  object_name(fkx.constid) as fk_name,
        fkx.keyno as num,
        object_name(fkx.fkeyid) as child_table,
        col_name(fkx.fkeyid, fkx.fkey) as child_column,
        object_name(fkx.rkeyid) as parent_table,
        col_name(fkx.rkeyid, fkx.rkey) as parent_column
from sysforeignkeys fkx
order by fk_name, fkx.keyno

Il est dans les tables système et des vues qui sont assez bien documentés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top