给定一个外键,我如何找到使用该特定键的所有表?

时间:2012-01-30 05:38:03

标签: sql-server

我有一个列(myColumn)作为表(tableA)的主键。 我注意到2或3个表将myColumn作为外键引用。 如何检测所有使用和引用myColumn的表?

我猜测超过3个表使用myColumn,因为当我尝试像这样更新它时

UPDATE tableA
SET myColumn = 1
WHERE myColumn = 1

更新了6行。

之前建议我使用

sp_helpconstraint('your_table_name')

但我发现这并没有提供我需要的完整信息。

还有其他建议吗?

2 个答案:

答案 0 :(得分:3)

试试这个 - 这是Mitch链接到的最新版SQL Server 2005和我原来答案的更新版本(适用于SQL Server 2000):

SELECT
    ConstraintName = fk.name,
    TableName = t.name,
    ColumnName = c.name
FROM
    sys.foreign_keys fk
INNER JOIN 
    sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id
INNER JOIN 
    sys.tables t ON fk.parent_object_id = t.object_id
INNER JOIN 
    sys.columns c ON fkc.parent_object_id = c.object_id AND fkc.parent_column_id = c.column_id
INNER JOIN 
    sys.tables tref ON fk.referenced_object_id = tref.object_id
INNER JOIN 
    sys.columns cref ON fkc.referenced_object_id = cref.object_id AND fkc.referenced_column_id = cref.column_id
WHERE
    tref.Name = 'Person'
    AND cref.Name = 'OID'

它使用系统目录视图sys.foreign_keyssys.foreign_key_columns来查找哪些表/列引用了您感兴趣的表和列。

您只需输入WHERE子句中的表名和列名 - 然后获取引用该表/列的其他表/列的列表

答案 1 :(得分:1)

如果您安装Redgate的免费sql搜索工具,您可以轻松地在数据库模式中搜索表和列名等字符串。

http://www.red-gate.com/products/sql-development/sql-search/

还有其他方法可以使用系统表搜索架构,但我强烈推荐使用此工具。如果您不断对大型数据库进行逆向工程,它将成为您日常工作流程的一部分。