在数百个表中查找相关列以供将来的关系识别

时间:2017-02-22 16:37:57

标签: sql sql-server db2 relational-database dimensional-modeling

我正在使用SQL Server 2016从我们的ERP系统中提取存储在DB2数据库中的信息。这有几千个表,里面没有键。从系统中提取表时,我希望能够在表中识别匹配的列名,这样我就可以在构建维时开始创建关系和键。

有没有办法创建一个查询来搜索我的数据库中的列名并列出使用该列名的每个表?我一直在使用OPENQUERYINFORMATION_SCHEMA.TABLES来确定我要拉过的表,但现在我想开始确定这些表之间的关系。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

我必须做一次类似的事情,最后使用类似的东西:

SELECT
     T.name
    ,C1.name
    ,C2.Name
FROM sys.Tables T
INNER JOIN sys.Columns C1
    ON C1.object_id = T.object_id
CROSS APPLY
    (
    SELECT OBJECT_NAME(CX.object_id) + '.' + CX.Name AS Name
    FROM sys.Tables TX
    INNER JOIN sys.Columns CX
        ON CX.object_id = TX.object_id
        AND TX.is_ms_shipped = 0
    WHERE CX.object_id <> T.object_id
    AND CX.name = C1.name
    AND CX.user_type_id = C1.user_type_id
    ) C2
;

当然,我们可以在这里发布的任何查询的问题是它将非常通用,因为我们不熟悉您的架构。例如,完全有可能你会有这样的表格:

T_Customers          T_Shipments
ID    | Name         ID    | Customer_ID
1     |  George      1     | 1
2     |  Jane        2     | 1
3     |  John        3     | 3

在这种情况下,T_Shipments.Customer_ID应该与T_Customers.ID相关联,但不会在此查询中,因为名称不同。

为了搜索这样的案例,我稍后修改了查询以与连接和模式搜索进行第二次比较。不是最快,但肯定是最彻底的 - 我们发现了以前我们都不知道的各种事情。不幸的是,如果没有更多细节,我甚至无法猜测你的表/属性是什么样的。

修改

请注意,CROSS APPLY包含对user_type_id的引用,因为我对查找具有相同名称但数据类型不同的列的时间并不感兴趣。对您来说情况可能并非如此,因此如果它不相关,您可以删除该引用。