Dada uma SourceTable e uma TargetTable, eu gostaria de criar programaticamente uma string com todas as junções necessárias.
Em resumo, 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
Estou certo de que isso já foi feito antes, mas não consigo encontrar um exemplo.
sql-server
sql-server-2014
recursive
system-tables
Metáfora
fonte
fonte
OrderItems
comOrders
e para trás comOrderItems
.Respostas:
Eu tinha um script que faz uma versão rudimentar da passagem de chave estrangeira. Eu o adaptei rapidamente (veja abaixo), e você pode usá-lo como ponto de partida.
Dada uma tabela de destino, o script tenta imprimir a cadeia de junção para o caminho mais curto (ou um deles no caso de vínculos) para todas as tabelas de origem possíveis, de modo que 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 algumas milhares de tabelas e muitas conexões FK nas quais eu tentei.
Como outros mencionam nos comentários, você precisará tornar isso mais complexo se precisar manipular chaves estrangeiras de várias colunas. Além disso, lembre-se de que esse código não está totalmente pronto para produção e totalmente testado. Espero que seja um ponto de partida útil se você decidir criar essa funcionalidade!
fonte
Você pode colocar a lista de chaves de uma tabela com dois campos TAB_NAME, KEY_NAME para todas as tabelas que você deseja conectar.
Exemplo, para tabela
City
da mesma forma
Province
eCountry
.Colete os dados para as tabelas e coloque em uma única tabela (por exemplo, tabela de metadados)
Agora rascunhe a consulta como abaixo
Isso mostra como você pode vincular as tabelas com base nas chaves correspondentes (mesmos nomes de chave)
Se você acha que o nome da chave pode não corresponder, inclua um campo de chave alternativo e tente usá-lo na condição where.
fonte
sys
tabelas existentes no SQL Server que descrevem as colunas em uma tabela, como as tabelas são vinculadas, etc. Tudo o que já existe. Construir suas próprias tabelas que definem sua estrutura de tabela para atender a uma necessidade específica pode ser uma posição de fallback, mas a resposta preferida usaria o que já existe, como a resposta aceita .