如何从SQL Server系统表识别外键?求对应外键查询方法
查询CustTable和CustTrans表的外键(SQL Server)
我明白你需要用类似主键查询的方式来获取CustTable和CustTrans这两个表的外键信息,而且你在SSMS对象资源管理器里没找到已定义的外键——没关系,我们可以通过系统视图直接查询到这些信息。
先回顾一下你之前使用的主键查询语句(方便对比参考):
select schema_name(tab.schema_id) as [schema_name], pk.[name] as pk_name, ic.index_column_id as column_id, col.[name] as column_name, tab.[name] as table_name from sys.tables tab inner join sys.indexes pk on tab.object_id = pk.object_id and pk.is_primary_key = 1 inner join sys.index_columns ic on ic.object_id = pk.object_id and ic.index_id = pk.index_id inner join sys.columns col on pk.object_id = col.object_id and col.column_id = ic.column_id where tab.name = 'custtable' or tab.name = 'custtrans' order by schema_name(tab.schema_id), pk.[name], ic.index_column_id
下面是修改后的外键查询语句,它会返回外键约束名称、所在列、关联的主键表及主键列等关键信息:
select schema_name(fk_tab.schema_id) as [schema_name], fk.[name] as fk_name, fk_col.column_id, fk_col.[name] as fk_column_name, fk_tab.[name] as fk_table_name, schema_name(pk_tab.schema_id) as referenced_schema_name, pk.[name] as referenced_pk_name, pk_col.[name] as referenced_pk_column_name, pk_tab.[name] as referenced_pk_table_name from sys.foreign_keys fk inner join sys.tables fk_tab on fk.parent_object_id = fk_tab.object_id inner join sys.tables pk_tab on fk.referenced_object_id = pk_tab.object_id inner join sys.foreign_key_columns fk_cols on fk.object_id = fk_cols.constraint_object_id inner join sys.columns fk_col on fk_tab.object_id = fk_col.object_id and fk_cols.parent_column_id = fk_col.column_id inner join sys.columns pk_col on pk_tab.object_id = pk_col.object_id and fk_cols.referenced_column_id = pk_col.column_id where fk_tab.name in ('custtable', 'custtrans') order by schema_name(fk_tab.schema_id), fk.[name], fk_cols.constraint_column_id
语句简单说明:
- 核心用
sys.foreign_keys获取外键约束的基础信息 - 通过
sys.foreign_key_columns关联外键列与对应的主键列 - 关联
sys.tables和sys.columns来补全表名、列名及架构信息 - 过滤条件依然锁定你指定的两个表
预期结果示例:
| schema_name | fk_name | column_id | fk_column_name | fk_table_name | referenced_schema_name | referenced_pk_name | referenced_pk_column_name | referenced_pk_table_name |
|---|---|---|---|---|---|---|---|---|
| dbo | FK_CUSTTRANS_CUSTTABLE | 1 | ACCOUNTNUM | CUSTTRANS | dbo | I_077ACCOUNTIDX | ACCOUNTNUM | CUSTTABLE |
| dbo | FK_CUSTTRANS_CUSTTABLE | 2 | DATAAREAID | CUSTTRANS | dbo | I_077ACCOUNTIDX | DATAAREAID | CUSTTABLE |
如果查询结果为空,大概率是两种情况:
- 这两个表确实没有定义数据库级别的外键约束
- 外键逻辑是在应用层实现的(比如Dynamics AX/365 Finance这类系统中常见),而非数据库层面的约束
内容的提问来源于stack exchange,提问作者user11821392
相关产品推荐
相关产品推荐

