Scénario :
Vous travaillez en tant que développeur SQL Server, vous êtes invité à fournir la requête qui doit renvoyer toutes les tables parentes, les tables de référence, les contraintes de clé étrangère et les colonnes utilisées dans la définition de la contrainte de clé étrangère.Solution :
Nous pouvons utiliser les vues système pour recueillir ces informations. Dans notre requête ci-dessous, nous utiliserons troisvues système
sys.foreign_keys
sys.foreign_key_columns
sys.columns
pour répondre la demande. Comme nous pouvons avoir des colonnes de clé primaire composites utilisées dans la contrainte de clé étrangère, j'ai utilisé FOR XML Path pour concaténer des lignes dans une colonne afin de pouvoir fournir une liste de colonnes sur une seule ligne.
;With CTE_FK AS ( SELECT Schema_Name(Schema_id) as TableSchemaName, object_name(FK.parent_object_id) ParentTableName, object_name(FK.referenced_object_id) ReferenceTableName, FK.name AS ForeignKeyConstraintName,c.name as ReferencedColumnList, cf.name as ParentColumnName FROM sys.foreign_keys AS FK INNER JOIN sys.foreign_key_columns AS FKC ON FK.OBJECT_ID = FKC.constraint_object_id INNER JOIN sys.columns c on c.OBJECT_ID = FKC.referenced_object_id AND c.column_id = FKC.referenced_column_id INNER JOIN sys.columns cf on cf.OBJECT_ID = FKC.parent_object_id AND cf.column_id = FKC.parent_column_id ) Select TableSchemaName, ParentTableName, ReferenceTableName, ForeignKeyConstraintName,stuff(( Select ','+ParentColumnName from CTE_FK i where i.ForeignKeyConstraintName=o.ForeignKeyConstraintName and i.TableSchemaName=o.TableSchemaName and i.ParentTableName=o.ParentTableName and i.ReferenceTableName=o.ReferenceTableName for xml path('')), 1, 1, '') ParentColumnList ,stuff(( Select ','+ReferencedColumnList from CTE_FK i where i.ForeignKeyConstraintName=o.ForeignKeyConstraintName and i.TableSchemaName=o.TableSchemaName and i.ParentTableName=o.ParentTableName and i.ReferenceTableName=o.ReferenceTableName for xml path('')), 1, 1, '') RefColumnList from CTE_FK o group by tableSchemaName, ParentTableName, ReferenceTableName, ForeignKeyConstraintName
J'ai exécuté le script ci-dessus sur l'une de mes bases de données et voici la sortie avec le nom du schéma, le nom de la table parente, le nom de la table référencée, le nom de la contrainte de clé étrangère, la liste des colonnes parentes et la liste des colonnes de référence utilisées dans la contrainte.
Comment obtenir la table parent, la table référencée, le nom de la contrainte de clé étrangère, la liste des colonnes dans SQL Server |
Démo vidéo :comment obtenir la table de clé primaire, la table de clé étrangère et le nom de contrainte dans SQL Server