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