我正在使用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会获得这些有用的信息?!
答案 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
你可以看到微软真正做到的。您可以查看其他系统存储过程,它们将“显示”您如何获取表元数据....