Scenariusz:
Pracujesz jako programista SQL Server, zostaniesz poproszony o dostarczenie zapytania, które powinno zwrócić wszystkie tabele nadrzędne, tabele referencyjne, ograniczenia klucza obcego i kolumny użyte w definicji ograniczenia klucza obcego.Rozwiązanie:
Do zbierania tych informacji możemy wykorzystać widoki systemowe. W poniższym zapytaniu użyjemy trzechwidoków systemowych
sys.foreign_keys
sys.foreign_key_columns
sys.columns
do odpowiedzi prośba. Ponieważ możemy mieć złożone kolumny klucza podstawowego używane w ograniczeniu klucza obcego, użyłem FOR XML Path do łączenia wierszy w kolumnę, dzięki czemu mogę podać listę kolumn w jednym wierszu.
;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
Wykonałem powyższy skrypt na jednej z moich baz danych, a oto wyniki z nazwą schematu, nazwą tabeli nadrzędnej, nazwą tabeli, do której istnieje odwołanie, nazwą ograniczenia klucza obcego, listą nadrzędnych kolumn i listą kolumn odniesienia używanych w ograniczeniu.
Jak uzyskać tabelę nadrzędną, tabelę odniesienia, nazwę ograniczenia klucza obcego, listę kolumn w SQL Server |
Wideo demonstracyjne:Jak uzyskać tabelę kluczy głównych, tabelę kluczy obcych i nazwę ograniczenia w programie SQL Server