2017-08-08 71 views
0

我需要获取所有外键的列表,它们属于哪个模式/表,它们引用了哪个模式/表,以及引用的列的名称。这是我迄今为止的,但返回的列是不正确的。有任何想法吗?SQL Server列表外键信息

select distinct 
    ParentSchema.name as PARENT_SCHEMA_NAME, 
    ParentTable.name as PARENT_TABLE_NAME, 
    TheSchema.name as TABLE_SCHEMA, 
    TheTable.name as TABLE_NAME,  
    fks.name as KEY_NAME , 
    COL_NAME(ParentTable.OBJECT_ID,fkcs.constraint_column_id) as CHILD_COLUMN_NAME 
from 
    sys.foreign_keys fks 
inner join 
    Sys.foreign_key_columns fkcs 
on 
    fks.parent_object_id = fkcs.parent_object_id 
inner join 
    sys.tables TheTable 
on 
    fks.parent_object_id = TheTable.object_id 
inner join 
    sys.tables ParentTable 
on 
    fks.referenced_object_id = ParentTable.object_id 
inner join 
    sys.schemas TheSchema 
on 
    TheTable.schema_id = TheSchema.schema_id 
inner join 
    sys.schemas ParentSchema 
on 
    ParentTable.schema_id = ParentSchema.schema_id 
order by 
    fks.name 

回答

2

我用下面的脚本得到我需要有关外键的信息,可能对您有用太:

SELECT KCU1.CONSTRAINT_NAME AS FK_CONSTRAINT_NAME 
     , KCU1.TABLE_NAME AS FK_TABLE_NAME 
     , KCU1.COLUMN_NAME AS FK_COLUMN_NAME 
     , KCU2.CONSTRAINT_NAME AS REFERENCED_CONSTRAINT_NAME 
     , KCU2.TABLE_NAME AS REFERENCED_TABLE_NAME 
     , KCU2.COLUMN_NAME AS REFERENCED_COLUMN_NAME 
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC 
     INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU1 ON KCU1.CONSTRAINT_CATALOG = RC.CONSTRAINT_CATALOG AND KCU1.CONSTRAINT_SCHEMA = RC.CONSTRAINT_SCHEMA AND KCU1.CONSTRAINT_NAME = RC.CONSTRAINT_NAME 
     INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU2 ON KCU2.CONSTRAINT_CATALOG = RC.UNIQUE_CONSTRAINT_CATALOG AND KCU2.CONSTRAINT_SCHEMA = RC.UNIQUE_CONSTRAINT_SCHEMA AND KCU2.CONSTRAINT_NAME = RC.UNIQUE_CONSTRAINT_NAME AND KCU2.ORDINAL_POSITION = KCU1.ORDINAL_POSITION 
WHERE KCU1.TABLE_NAME = 'PurchaseOrders' 

对于表PurchaseOrders,在WideWorldImporters数据库它显示了以下信息:

enter image description here

您可以检查出所有列列入information_schema.referential_constraintsinformation_schema.key_column_usage然后更改查询以适合您的需要。