2011-06-13 115 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>