Find related columns among hundreds of tables for future relational identification

旧城冷巷雨未停 提交于 2019-12-11 01:51:48

问题


I am using SQL Server 2016 to pull information out of our ERP system that is stored in a DB2 database. This has thousands of tables with no keys inside of them. When pulling tables from the system, I want to be able to identify matching column names in tables so I can start creating relationships and keys when building dimensions.

Is there a way to create a query that will search my database for column names and list every table that uses that column name? I have been using OPENQUERY and INFORMATION_SCHEMA.TABLES to determine the tables I want to pull over but now I want to start determining relationships between those tables.

Any help would be much appreciated!


回答1:


You can look in the old yet gold system tables. A few examples

find all tables with a column named like ID

select so.name, sc.name
from sys.sysobjects so
join sys.syscolumns sc on sc.id = so.id
where so.xtype = N'U'
and sc.name like 'ID%'

Find the FKs from a table

select so2.name
from sys.sysobjects so
join sys.sysforeignkeys fk on so.id = fk.rkeyid
join sys.sysobjects so2 on fk.fkeyid = so2.id
where so.name = 'MyTable'

Check MSDN documentation for further reference and if you want any specific combination just post a new question.




回答2:


I had to do something similar once, and ended up using something similar to this:

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
;

Of course, the problem with any query that we can post here is that it will be extremely generalized, because we aren't familiar with your schema. It's entirely possible, for example, that you will have tables like these:

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

In a case such as that, T_Shipments.Customer_ID should be linked to T_Customers.ID, but won't be in this query, because the name is different.

To search for cases like that, I modified the query later to do a second comparison with concatenations and pattern searches. Not the speediest, but certainly the most thorough - we found all sorts of things we didn't know before. Unfortunately, I can't even begin to guess what your tables/attributes might look like without a lot of further details.

Edit:

Please note that the CROSS APPLY includes a reference to user_type_id, because I wasn't interested at the time in finding columns that had the same name but were a different data type. That might not be the case for you, so you can remove that reference if it isn't relevant.



来源:https://stackoverflow.com/questions/42397279/find-related-columns-among-hundreds-of-tables-for-future-relational-identificati

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!