sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo obtener la tabla principal, la tabla de referencia, el nombre de restricción de clave externa y las columnas en SQL Server - Tutorial de SQL Server / TSQL, parte 71

Escenario:

Está trabajando como desarrollador de SQL Server, se le pide que proporcione la consulta que debe devolver todas las tablas principales, tablas de referencia, restricciones de clave externa y columnas utilizadas en la definición de restricción de clave externa.

Solución:

Podemos usar las vistas del sistema para recopilar esta información. En nuestra consulta a continuación, usaremos tres

vistas del sistema
sys.foreign_keys
sys.foreign_key_columns
sys.columns

para responder la solicitud. Como podemos tener columnas de clave principal compuestas que se usan en la restricción de clave externa, he usado FOR XML Path para concatenar filas en columnas, de modo que pueda proporcionar una lista de columnas en una sola fila.

;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


Ejecuté el script anterior en una de mis bases de datos y aquí se muestra el nombre del esquema, el nombre de la tabla principal, el nombre de la tabla referenciada, el nombre de la restricción de la clave externa, la lista de la columna principal y la lista de la columna de referencia utilizada en la restricción.
Cómo obtener la tabla principal, la tabla referenciada, el nombre de restricción de clave externa, la lista de columnas en SQL Server


Video de demostración:Cómo obtener la tabla de clave principal, la tabla de clave externa y el nombre de restricción en SQL Server