Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment obtenir la table parent, la table de référence, le nom de la contrainte de clé étrangère et les colonnes dans SQL Server - Tutoriel SQL Server / TSQL Partie 71

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 trois

vues 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