Создание сценария запроса для объединения всех таблиц в базе данных на основе отношений - PullRequest
1 голос
/ 22 января 2020

Я вытащил несколько SQL из различных вопросов о переполнении стека, чтобы помочь мне вывести мои отношения в моей базе данных. Это было очень полезно. (Я бросил все это в #temptable).

SELECT  fk.name 'FK Name',
        tp.name 'Parent table',
        cp.name, cp.column_id,
        tr.name 'Refrenced table',
        cr.name, cr.column_id
FROM    sys.foreign_keys fk
INNER JOIN  sys.tables tp ON fk.parent_object_id = tp.object_id
INNER JOIN  sys.tables tr ON fk.referenced_object_id = tr.object_id
INNER JOIN  sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id
INNER JOIN  sys.columns cp ON fkc.parent_column_id = cp.column_id AND fkc.parent_object_id = cp.object_id
INNER JOIN  sys.columns cr ON fkc.referenced_column_id = cr.column_id AND fkc.referenced_object_id = cr.object_id
ORDER BY    tp.name, cp.column_id

Это было сделано для создания сценариев, в которых есть Joins / et c на всех моих таблицах для всех моих отношений. Теперь у меня есть небольшая дилемма, я не совсем уверен, как это сделать.

Например, выходные данные выше показывают следующее:

enter image description here

Показывает родительскую таблицу с именем Business с серией полей называется ID_BsinessCategory, ID_BusinessGroup и др. c. Они связаны со справочными таблицами, которые называются BusinessCategory и BusinessGroup.

Мне нужно написать скрипт, который будет создавать для меня объединения

select * 
from Business a
join BusinessCategory b on a.ID_BusinessCategory = b.ID_BusinessCategory 

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

Буду признателен за любой совет.

1 Ответ

0 голосов
/ 23 января 2020

Это может быть хорошей отправной точкой

DECLARE @join_query NVARCHAR(MAX)

DROP TABLE #temptable

SELECT  fk.name  AS 'FK Name',
        tp.name AS 'Parent table',
        cp.name AS parent_col, 
        cp.column_id AS parent_col_id,
        tr.name AS 'Refrenced table',
        cr.name AS child_col_id, 
        cr.column_id
INTO #temptable
FROM    sys.foreign_keys fk
INNER JOIN  sys.tables tp ON fk.parent_object_id = tp.object_id
INNER JOIN  sys.tables tr ON fk.referenced_object_id = tr.object_id
INNER JOIN  sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id
INNER JOIN  sys.columns cp ON fkc.parent_column_id = cp.column_id AND fkc.parent_object_id = cp.object_id

INNER JOIN  sys.columns cr ON fkc.referenced_column_id = cr.column_id AND fkc.referenced_object_id = cr.object_id
ORDER BY    tp.name, cp.column_id

SELECT @join_query =  CONCAT(
    'SELECT * FROM ', [Parent table],
    STRING_AGG(
        ' JOIN ' + 
        [Refrenced table] + 
        ' ON [' + [Parent table] + '].' + parent_col + ' = [' +
        [Refrenced table] + '].' + child_col_id + ' '
    , '')
)   
FROM #temptable
GROUP BY [Parent table]


EXEC sp_executesql @join_query

То, что делает вышеприведенный оператор после воссоздания вашей временной таблицы, состоит в том, чтобы создать оператор, который объединяет эти отношения в JOIN s, группируя по каждой родительской таблице , После этого он выполняет оператор, хранящийся в @join_query.

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

...