如何从Information_Schema视图获取有关可空外键的信息?

时间:2009-07-28 11:46:45

标签: sql-server foreign-keys metadata nullable

我正在使用Sql Server 2005中的INFORMATION_SCHEMA视图& 2008年获取数据库的元数据:

SELECT
    PK.TABLE_NAME as 'PK_TABLE_NAME',
    FK.TABLE_NAME as 'FK_TABLE_NAME',
    C.CONSTRAINT_NAME as 'CONSTRAINT_NAME'
FROM
    INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
    JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
    JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
WHERE
    FK.TABLE_NAME = 'Table_Name' 

但是,如果我在表上有一个可以为空的外键,则它不会包含在我的结果中,因为“UNIQUE_CONSTRAINT_NAME”列没有匹配的条目。

我正在努力解决如何使用INFORMATION_SCHEMA架构中的视图获取有关可为空的外键(特别是引用的表和列的名称)的信息。显然索引不是标准的一部分,因此aren't included in the views

有谁知道如何更改我的查询以获取有关可以为空的外键的信息?

修改

顺便说一下,看来SQL Server Compact Edition has an INFORMATION_SCHEMA.INDEXES view - 为什么CE会获得这些有用的信息?!

2 个答案:

答案 0 :(得分:2)

我看过它并不是可以为空的FK,但是FK指向一个唯一的索引而不是一个唯一的约束/主键,它看起来像我。

尽管两者都是作为索引实现的,但TABLE_CONSTRAINTS

中不会出现唯一索引

没有“INFORMATION_SCHEMA.INDEXES”。

因此,选项是使用“sys”视图...

编辑:使用sys.indexes获取缺失的位。我不知道为什么SQL CE有这个观点...

SELECT
    ISNULL(PK.TABLE_NAME, OBJECT_NAME(I.[object_id])) as 'PK_TABLE_NAME',
    FK.TABLE_NAME as 'FK_TABLE_NAME',
    C.CONSTRAINT_NAME as 'CONSTRAINT_NAME'
FROM
    INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
    JOIN
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
    LEFT JOIN
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
    LEFT JOIN
    sys.indexes I ON C.UNIQUE_CONSTRAINT_NAME = I.[name]

答案 1 :(得分:2)

jusy查看 sp_helpconstraint

的源代码

在管理工作室中,请进入:

  Databases  
    System Databases  
      master  
        Programmability  
          Stored Procedures  
            System Stored Procedures  
              sp_helpconstraint

你可以看到微软真正做到的。您可以查看其他系统存储过程,它们将“显示”您如何获取表元数据....