Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come ottenere la tabella padre, la tabella di riferimento, il nome del vincolo della chiave esterna e le colonne in SQL Server - Tutorial SQL Server / TSQL Parte 71

Scenario:

Stai lavorando come sviluppatore di SQL Server, ti viene chiesto di fornire la query che dovrebbe restituire tutte le tabelle padre, le tabelle di riferimento, i vincoli di chiave esterna e le colonne utilizzate nella definizione di vincoli di chiave esterna.

Soluzione:

Possiamo utilizzare le viste di sistema per raccogliere queste informazioni. Nella nostra query di seguito utilizzeremo tre

viste di sistema
sys.foreign_keys
sys.foreign_key_columns
sys.columns

per rispondere la richiesta. Poiché possiamo avere colonne di chiave primaria composte utilizzate nel vincolo di chiave esterna, ho usato FOR XML Path per concatenare le righe in colonne in modo da poter fornire un elenco di colonne in una singola riga.

;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


Ho eseguito lo script precedente su uno dei miei database e qui viene visualizzato il nome dello schema, il nome della tabella principale, il nome della tabella di riferimento, il nome del vincolo della chiave esterna, l'elenco delle colonne principali e l'elenco delle colonne di riferimento utilizzati nel vincolo.
Come ottenere la tabella padre, la tabella di riferimento, il nome del vincolo della chiave esterna, l'elenco delle colonne in SQL Server


Video demo:come ottenere la tabella delle chiavi primarie, la tabella delle chiavi esterne e il nome del vincolo in SQL Server