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 treviste 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