Étant donné un SourceTable et un TargetTable, je voudrais créer par programme une chaîne avec toutes les jointures requises.
En bref, j'essaie de trouver un moyen de créer une chaîne comme celle-ci:
FROM SourceTable t
JOIN IntermediateTable t1 on t1.keycolumn = t.keycolumn
JOIN TargetTable t2 on t2.keycolumn = t1.keycolumn
J'ai une requête qui renvoie toutes les clés étrangères pour une table donnée, mais je suis confronté à des limitations en essayant de parcourir tout cela récursivement pour trouver le chemin de jointure optimal et créer la chaîne.
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
Je suis sûr que cela a déjà été fait, mais je n'arrive pas à trouver d'exemple.
sql-server
sql-server-2014
recursive
system-tables
Métaphore
la source
la source
OrderItems
àOrders
et revenir avecOrderItems
.Réponses:
J'avais un script qui fait une version rudimentaire de la traversée de clé étrangère. Je l'ai adapté rapidement (voir ci-dessous), et vous pourrez peut-être l'utiliser comme point de départ.
Étant donné une table cible, le script tente d'imprimer la chaîne de jointure pour le chemin le plus court (ou l'un d'entre eux dans le cas de liens) pour toutes les tables source possibles de sorte que les clés étrangères à une seule colonne puissent être parcourues pour atteindre la table cible. Le script semble bien fonctionner sur la base de données avec quelques milliers de tables et de nombreuses connexions FK sur lesquelles je l'ai essayé.
Comme d'autres le mentionnent dans les commentaires, vous devrez rendre cela plus complexe si vous devez gérer des clés étrangères multi-colonnes. Sachez également que ce code n'est en aucun cas prêt pour la production et entièrement testé. J'espère que c'est un point de départ utile si vous décidez de développer cette fonctionnalité!
la source
Vous pouvez mettre la liste des clés d'une table avec deux champs TAB_NAME, KEY_NAME pour toutes les tables que vous souhaitez connecter.
Exemple, pour table
City
de même
Province
etCountry
.Collectez les données des tableaux et mettez-les dans un seul tableau (par exemple, tableau de métadonnées)
Maintenant rédigez la requête comme ci-dessous
Cela vous permettra de savoir comment lier les tables en fonction des clés correspondantes (mêmes noms de clés)
Si vous pensez que le nom des clés peut ne pas correspondre, vous pouvez inclure un autre champ de clé et essayer de l'utiliser dans la condition where.
la source
sys
tables existantes dans SQL Server qui décrivent les colonnes d'une table, comment les tables sont liées entre elles, etc. Tout ce qui existe déjà. Construire vos propres tables qui définissent la structure de votre table pour répondre à un besoin spécifique pourrait être une position de repli, mais la réponse préférée utiliserait ce qui existe déjà, comme le fait la réponse acceptée .