sql >> Databáze >  >> RDS >> Sqlserver

Jak získat nadřazenou tabulku, referenční tabulku, název omezení cizího klíče a sloupce v SQL Server - SQL Server / Výukový program TSQL, část 71

Scénář:

Pracujete jako SQL Server Developer, budete požádáni o zadání dotazu, který by měl vrátit všechny nadřazené tabulky, referenční tabulky, omezení cizího klíče a sloupce použité v definici omezení cizího klíče.

Řešení:

Ke shromáždění těchto informací můžeme použít systémové pohledy. V našem níže uvedeném dotazu použijeme k odpovědi tři

systémová zobrazení
sys.foreign_keys
sys.foreign_key_columns
sys.columns

požadavek. Protože v omezení cizího klíče můžeme použít složené sloupce primárního klíče, použil jsem FOR XML Path ke zřetězení řádků do sloupce, abych mohl poskytnout seznam sloupců v jednom řádku.

;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


Spustil jsem výše uvedený skript na jedné ze svých databází a zde je výstup s názvem schématu, názvem nadřazené tabulky, názvem odkazované tabulky, názvem omezení cizího klíče, seznamem nadřazených sloupců a seznamem referenčních sloupců použitých v omezení.
Jak získat nadřazenou tabulku, referenční tabulku, název omezení cizího klíče, seznam sloupců na serveru SQL


Video ukázka:Jak získat tabulku primárních klíčů, tabulku cizích klíčů a název omezení na serveru SQL

  1. Použití replikačních slotů PostgreSQL

  2. Operátor SQL AND pro začátečníky

  3. Jak zřetězit sloupce v Postgres SELECT?

  4. Proč EF generuje SQL dotazy se zbytečnými kontrolami null?