列出关系中的表名和列

时间:2012-07-04 10:44:15

标签: sql sql-server

我正在尝试获取一些返回以下内容的查询:

TableName | ColumnName | IsColumnInRelation | RelatedTable | RelationKind | InsertUpdateSepecification | IsNull | Describtion
-------------------------------------------------------------------------------------------------------------------------------------
  Company |  Personel  |        Yes         |   Employee   |      One     |           Cascade          |  True  | 'company employees'
  Company |     ID     |        No          |   --------   |      ---     |           -------          |  False | 'company pk'
  Company |     Name   |        No          |   --------   |      ---     |           -------          |  False | 'name of company'
  Company |  Country   |        Yes         |   Contries   |      Many    |           No Action        |  False | 'companies placement'
  Company |     .      |         .          |       .      |       .      |              .             |    .   | ''
  Company |     .      |         .          |       .      |       .      |              .             |    .   | ''
  Company |     .      |         .          |       .      |       .      |              .             |    .   | ''
  Company |     .      |         .          |       .      |       .      |              .             |    .   | ''

有人可以帮忙吗? 谢谢。

2 个答案:

答案 0 :(得分:1)

这应该可以满足您的需求:

SELECT t.name AS [TableName]
    ,c.name AS [ColumnName]
    ,CASE WHEN COALESCE(tr.name, tr2.name) IS NULL THEN 'No' 
        ELSE 'Yes' END AS IsColumnInRelation
    ,COALESCE(tr.name, tr2.name) AS [RelatedTable]
    ,COALESCE(cr.name, cr2.name) AS [RelatedColumn] 
    ,CASE WHEN COALESCE(tr.name, tr2.name) IS NOT NULL THEN
        CASE WHEN i.object_id IS NOT NULL THEN 'One'
        ELSE 'Many' END
     END AS RelationKind
    ,COALESCE(f.update_referential_action_desc, f2.update_referential_action_desc) AS [InsertUpdateAction]
    ,COALESCE(f.delete_referential_action_desc, f2.delete_referential_action_desc) AS [DeleteAction]
    ,c.is_nullable AS [IsNull]
    ,p.value AS Description
FROM sys.columns c
    INNER JOIN sys.tables t
        ON t.object_id= c.object_id

    -- Used for the column description.
    LEFT JOIN sys.extended_properties p 
        ON c.object_id = p.major_id
        AND c.column_id = p.minor_id
        AND p.name = 'MS_Description'

    -- Used to identify if this is a primary key.
    -- If it is, then this is on the "One" side of the relationship.
    LEFT JOIN  sys.index_columns  ic
        ON ic.object_id = c.object_id 
        AND ic.column_id = c.column_id
    LEFT JOIN sys.indexes  i
        ON ic.object_id = i.object_id 
        AND i.is_primary_key = 1

    -- Used to get the tables and columns that relate to this column.
    LEFT JOIN sys.foreign_key_columns AS fc
        ON c.object_id = fc.parent_object_id
        AND c.column_id = fc.parent_column_id
    LEFT JOIN sys.columns cr
        ON cr.object_id = fc.referenced_object_id
        AND cr.column_id = fc.referenced_column_id
    LEFT JOIN sys.tables tr
        ON cr.object_id = tr.object_id

    -- Used to get the update/delete action for the [fc] relationship.
    LEFT JOIN sys.foreign_keys f
        ON f.object_id = fc.constraint_object_id

    -- Used to get the tables and columns that this column relates to.
    LEFT JOIN sys.foreign_key_columns AS fc2
        ON c.object_id = fc2.referenced_object_id
        AND c.column_id = fc2.referenced_column_id
    LEFT JOIN sys.columns cr2
        ON cr2.object_id = fc2.parent_object_id
        AND cr2.column_id = fc2.parent_column_id
    LEFT JOIN sys.tables tr2
        ON cr2.object_id = tr2.object_id

    -- Used to get the update/delete action for the [fc2] relationship.
    LEFT JOIN sys.foreign_keys f2
        ON f2.object_id = fc2.constraint_object_id
ORDER BY t.name, c.name, COALESCE(tr.name, tr2.name), COALESCE(cr.name, cr2.name)

答案 1 :(得分:0)

这里有些东西可以帮助你。 它显示了数据库中的所有关系:

SELECT
K_Table = FK.TABLE_NAME,
FK_Column = CU.COLUMN_NAME,
PK_Table = PK.TABLE_NAME,
PK_Column = PT.COLUMN_NAME,
Constraint_Name = C.CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME
INNER JOIN (
SELECT i1.TABLE_NAME, i2.COLUMN_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY'
) PT ON PT.TABLE_NAME = PK.TABLE_NAME