使用information_schema在MS SQL Server中查找外键。

5

我正在尝试查找所有具有指向特定表的外键的表。因此,我编写了以下代码:

select t1.TABLE_NAME as pointsfrom, t2.TABLE_NAME as pointsto
        from INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS r
        join INFORMATION_SCHEMA.TABLE_CONSTRAINTS t1 on t1.CONSTRAINT_NAME=r.CONSTRAINT_NAME
        join INFORMATION_SCHEMA.TABLE_CONSTRAINTS t2 on t2.CONSTRAINT_NAME=r.UNIQUE_CONSTRAINT_NAME
        where t2.table_name = @mytable

这个方法在数据库中的24个外键中有22个(90%)是可行的。但对于2个外键来说,unique_constraint_name与table_constraints中的任何名称都不匹配。
这些名称也有点奇怪。其中一个是“environment designator”,有一个空格。该外键指向的字段名为“environment_designator”,有一个下划线。另一个具有唯一约束名“filename is unique”,但我在“from”表或“to”表的定义中看不到任何相应的内容。
是否有其他地方可以查找unique_constraint_name的匹配项?
1个回答

7

试试这个:

SELECT OBJECT_NAME(parent_object_id), OBJECT_NAME(referenced_object_id)
    FROM sys.foreign_keys
    WHERE referenced_object_id = OBJECT_ID(@mytable)

嗯,这似乎确实有效。我本来希望使用information_schema来解决问题,因为(a)我已经在应用程序的其他地方使用了information_schema,并且我想保持一致;(b)我从未使用过sys目录表,也不想涉及其中。但是,能够工作的东西总是比不能工作的东西更可取,所以我想我会采用你的解决方案。如果有人知道如何使用information_schema使其工作,请发布!如果sys cat解决方案有效,我不认为我会切换回去,但是好奇的人想要知道。 - Jay
2
请参考@Jay See的文章《反对INFORMATION_SCHEMA视图》(https://sqlblog.org/2011/11/03/the-case-against-information_schema-views)获取更多信息。 - Joe Stefanelli
是的,我想我正在理解这个。我怀疑我不会重新制作现有的工作代码,下次我想我会直接使用SQL Server特定的对象。我曾经有一个愚蠢的想法,认为使用information_schema更好,因为那应该是行业标准。 - Jay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接