Dada uma SourceTable e uma TargetTable, gostaria de criar programaticamente uma string com todas as junções necessárias.
Resumindo, estou tentando encontrar uma maneira de criar uma string como esta:
FROM SourceTable t
JOIN IntermediateTable t1 on t1.keycolumn = t.keycolumn
JOIN TargetTable t2 on t2.keycolumn = t1.keycolumn
Eu tenho uma consulta que retorna todas as chaves estrangeiras para uma determinada tabela, mas estou enfrentando limitações ao tentar executar tudo isso recursivamente para encontrar o caminho de junção ideal e criar a string.
SELECT
p.name AS ParentTable
,pc.name AS ParentColumn
,r.name AS ChildTable
,rc.name AS ChildColumn
FROM sys.foreign_key_columns fk
JOIN sys.columns pc ON pc.object_id = fk.parent_object_id AND pc.column_id = fk.parent_column_id
JOIN sys.columns rc ON rc.object_id = fk.referenced_object_id AND rc.column_id = fk.referenced_column_id
JOIN sys.tables p ON p.object_id = fk.parent_object_id
JOIN sys.tables r ON r.object_id = fk.referenced_object_id
WHERE fk.parent_object_id = OBJECT_ID('aTable')
ORDER BY ChildTable, fk.referenced_column_id
Tenho certeza de que isso já foi feito antes, mas não consigo encontrar um exemplo.
Eu tinha um script que faz uma versão rudimentar da travessia de chave estrangeira. Adaptei-o rapidamente (veja abaixo) e talvez você possa usá-lo como ponto de partida.
Dada uma tabela de destino, o script tenta imprimir a string de junção para o caminho mais curto (ou um deles no caso de empates) para todas as tabelas de origem possíveis, de modo que as chaves estrangeiras de coluna única possam ser percorridas para alcançar a tabela de destino. O script parece estar funcionando bem no banco de dados com alguns milhares de tabelas e muitas conexões FK nas quais experimentei.
Como outros mencionaram nos comentários, você precisa tornar isso mais complexo se precisar lidar com chaves estrangeiras de várias colunas. Além disso, esteja ciente de que este não é, de forma alguma, um código totalmente testado e pronto para produção. Espero que seja um ponto de partida útil se você decidir criar essa funcionalidade!
Você pode colocar a lista de chaves de uma tabela com dois campos TAB_NAME,KEY_NAME para todas as tabelas que deseja conectar.
Exemplo, para mesa
City
da mesma forma
Province
eCountry
.Colete os dados para as tabelas e coloque em uma única tabela (por exemplo, tabela de metadados)
Agora elabore a consulta como abaixo
Isso mostrará como você pode vincular as tabelas com base nas chaves correspondentes (mesmos nomes de chave)
Se você acha que o nome das chaves pode não corresponder, pode incluir um campo de chave alternativo e tentar usá-lo na condição where.