Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So erhalten Sie die übergeordnete Tabelle, die Referenztabelle, den Fremdschlüssel-Einschränkungsnamen und die Spalten in SQL Server - SQL Server / TSQL-Tutorial Teil 71

Szenario:

Sie arbeiten als SQL Server-Entwickler und werden gebeten, die Abfrage bereitzustellen, die alle übergeordneten Tabellen, Referenztabellen, Fremdschlüsseleinschränkungen und Spalten zurückgeben soll, die in der Fremdschlüsseleinschränkungsdefinition verwendet werden.

Lösung:

Wir können die Systemansichten verwenden, um diese Informationen zu sammeln. In unserer Abfrage unten verwenden wir drei

Systemansichten
sys.foreign_keys
sys.foreign_key_columns
sys.columns

zur Beantwortung die Anfrage. Da wir zusammengesetzte Primärschlüsselspalten haben können, die in Foreign Key Constraint verwendet werden, habe ich FOR XML Path verwendet, um Zeilen in Spalten zu verketten, sodass ich eine Liste von Spalten in einer einzelnen Zeile bereitstellen kann.

;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


Ich habe das obige Skript auf einer meiner Datenbanken ausgeführt und hier ist die Ausgabe mit dem Schemanamen, dem Namen der übergeordneten Tabelle, dem Namen der referenzierten Tabelle, dem Namen der Fremdschlüsselbeschränkung, der Liste der übergeordneten Spalten und der in der Beschränkung verwendeten Referenzspaltenliste.
Wie man übergeordnete Tabelle, referenzierte Tabelle, Namen der Fremdschlüsselbeschränkung, Spaltenliste in SQL Server erhält


Video-Demo:So erhalten Sie eine Primärschlüsseltabelle, eine Fremdschlüsseltabelle und einen Beschränkungsnamen in SQL Server