1

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

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 模式中的视图获取有关可为空的外键(特别是引用的表和列的名称)的信息。显然索引不是标准的一部分,因此不包含在视图中

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

编辑

顺便说一句,SQL Server Compact Edition 似乎有一个 INFORMATION_SCHEMA.INDEXES 视图——为什么 CE 会得到这个有用的信息?!

4

2 回答 2

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]
于 2009-07-28T12:20:55.367 回答
2

jusy 查看sp_helpconstraint的源代码

在管理工作室中,进入:

  Databases  
    System Databases  
      master  
        Programmability  
          Stored Procedures  
            System Stored Procedures  
              sp_helpconstraint

你可以看到微软确实做到了。您可以查看其他系统存储过程,这些过程将“展示”您如何获取表元数据......

于 2009-07-28T13:11:03.667 回答