2011-06-13 73 views
3

我有一些SQL获取有关表的一些细节。SQL - 查找列FK的详细信息

SELECT Column_Name, Is_Nullable, Data_Type, Character_Maximum_Length 
FROM Information_Schema.Columns 
WHERE Table_Name='GenSchool' 

目前为止工作正常,并且在表中每列返回一行。然而,我想要的是,它也会返回一些外键的细节。例如,GenSchool的列SchoolType的FK为GenSchoolType.Code

除了上面选择的列,我需要查询返回链接表的FK表和列名或NULL列没有FK的列。

这是从上面的查询返回的。

Code   NO nvarchar 10 
CodeDescription YES nvarchar 80 
Deleted   NO bit   NULL 
Type   NO nvarchar 20 

,我想它会返回类似

Code   NO nvarchar 10  NULL    NULL 
CodeDescription YES nvarchar 80  NULL    NULL 
Deleted   NO bit   NULL NULL    NULL 
Type   NO nvarchar 20  GenSchoolType Code 

我一直在使用内部连接上sys表尝试的年龄,但我不会在任何地方获得。如果你需要我展示我试过的东西,我可以。

预先感谢您。

回答

2

所以,我终于摸索出了解决方案。

with fks as ( 
    select fk.name AS 'FKName', o_p.name AS 'ParentNameTable', 
     c_p.name AS 'ParentNameColumn', o_r.name AS 'ReferencedNameTable', 
     c_r.name AS 'ReferencedNameColumn', fkc.* 
    from sys.foreign_key_columns fkc 
    inner join sys.foreign_keys fk on fk.object_id = fkc.constraint_object_id 
    inner join sys.objects o_p on o_p.object_id = fkc.parent_object_id 
    inner join sys.objects o_r on o_r.object_id = fkc.referenced_object_id 
    inner join sys.columns c_p on c_p.object_id = fkc.parent_object_id and c_p.column_id = fkc.parent_column_id 
    inner join sys.columns c_r on c_r.object_id = fkc.referenced_object_id and c_r.column_id = fkc.referenced_column_id 
) 
select c.Table_Name, c.Column_Name, c.Is_Nullable, c.Data_Type, 
    c.Character_Maximum_Length, COLUMNPROPERTY(OBJECT_ID(@table), 
    c.Column_Name,'IsIdentity') AS 'Is_Identity', 
    fks.FKName, fks.ReferencedNameTable, fks.ReferencedNameColumn 
from information_schema.columns c 
left join fks on c.Table_Name = fks.ParentNameTable and c.Column_Name = fks.ParentNameColumn 
where c.table_name = @table 

这将返回每列一列在数据库中与下列数据

  1. 表名称
  2. 列名
  3. 可空
  4. 数据类型
  5. 最大长度
  6. 身份
  7. FK名称
  8. 表中引用
  9. 列中引用

随意使用这是否符合您的需求。

1

加入到information_schema.REFERENTIAL_CONSTRAINTS

SELECT Column_Name, Is_Nullable, Data_Type, Character_Maximum_Length, rc.REFERENCED_TABLE_NAME 
FROM Information_Schema.Columns c 
left join information_schema.REFERENTIAL_CONSTRAINTS rc on rc.TABLE_NAME = c.TABLE_NAME 
WHERE Table_Name='GenSchool' 
+0

感谢您的回复。我收到无效的列错误。 REFERENTIAL_CONSTRAINTS似乎没有列REFERENCED_TABLE_NAME和TABLE_NAME。如果它使任何不同,我正在使用MS SQL Server 2008 R2。 – 2011-06-13 14:22:59

1

下面是从MSDN页面与您的查询的查询。

SELECT TABLE_NAME, CONSTRAINT_NAME , COLUMN_NAME , ORDINAL_POSITION 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE  
WHERE CONSTRAINT_NAME IN ( 
    SELECT CONSTRAINT_NAME 
    FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS) 
ORDER BY TABLE_NAME, ORDINAL_POSITION 
+0

感谢您的回复。您发布的查询工作并返回该表的FK详细信息,但返回与其关联的表的详细信息。此外,查询需要返回orignal细节,因此我如何将此查询加入到第一个查询中。 – 2011-06-13 14:24:58

+0

不幸的是我现在没有办法测试这个。如果您阅读链接(http://msdn.microsoft.com/zh-cn/library/aa175805%28v=sql.80%29.aspx)中的“创建缺少的视图部分”一节,我已提供,您将大概找到答案。 – 2011-06-13 15:02:51

1

你尝试sp_fkeys

exec sp_fkeys <TableName>