2

Я использую SQL Server 2016 для извлечения информации из нашей системы ERP, которая хранится в базе данных DB2. У этого есть тысячи таблиц без ключей внутри них. При вытягивании таблиц из системы я хочу иметь возможность идентифицировать совпадающие имена столбцов в таблицах, чтобы я мог создавать отношения и ключи при построении измерений.Найти связанные столбцы среди сотен таблиц для будущей реляционной идентификации

Есть ли способ создать запрос, который будет искать в моей базе данных имена столбцов и список каждой таблицы, использующей имя этого столбца? Я использовал OPENQUERY и INFORMATION_SCHEMA.TABLES, чтобы определить таблицы, которые я хочу переместить, но теперь я хочу начать определять отношения между этими таблицами.

Любая помощь была бы высоко оценена!

+5

Вы смотрели ИНФОРМАЦИЮ_SCHEMA.COLUMNS? –

ответ

1

Вы можете посмотреть в старых, но золотых системных таблицах. Несколько примеров

найти все таблицы с колонки с именем, как 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%' 

Найдите самые FKs из таблицы

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' 

Проверить MSDN документацию для дальнейшего использования, и если вы хотите какой-либо конкретной комбинации просто отправьте новый вопрос.

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, но не будет в этом запросе, поскольку имя отличается ,

Чтобы найти такие случаи, я позже изменил запрос, чтобы сделать второе сравнение с конкатенациями и поисками шаблонов. Не самый быстрый, но, безусловно, самый тщательный - мы нашли все виды вещей, о которых мы раньше не знали. К сожалению, я даже не могу догадаться, как выглядят ваши таблицы/атрибуты без большого количества подробностей.

Edit:

Пожалуйста, обратите внимание, что CROSS APPLY включает в себя ссылку на user_type_id, потому что я не был заинтересован в то время в поиске столбцов, которые имели такое же имя, но были разными типами данных. Возможно, это не так, потому что вы можете удалить эту ссылку, если это не имеет значения.

+0

Это сработало отлично, спасибо за вашу помощь !!! – Daniel

 Смежные вопросы

  • Нет связанных вопросов^_^