Bei einer SourceTable und einer TargetTable möchte ich programmgesteuert eine Zeichenfolge mit allen erforderlichen Verknüpfungen erstellen.
Kurz gesagt, ich versuche einen Weg zu finden, um einen String wie diesen zu erstellen:
FROM SourceTable t
JOIN IntermediateTable t1 on t1.keycolumn = t.keycolumn
JOIN TargetTable t2 on t2.keycolumn = t1.keycolumn
Ich habe eine Abfrage, die alle Fremdschlüssel für eine bestimmte Tabelle zurückgibt, stoße jedoch auf Einschränkungen, wenn ich versuche, all dies rekursiv durchzugehen, um den optimalen Verknüpfungspfad zu finden und die Zeichenfolge zu erstellen.
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
Ich bin mir sicher, dass dies schon einmal gemacht wurde, aber ich kann anscheinend kein Beispiel finden.
OrderItems
mitOrders
und zurück mitOrderItems
.Antworten:
Ich hatte ein Skript, das eine rudimentäre Version der Fremdschlüsselüberquerung ausführt. Ich habe es schnell angepasst (siehe unten), und Sie können es möglicherweise als Ausgangspunkt verwenden.
Bei einer gegebenen Zieltabelle versucht das Skript, die Verknüpfungszeichenfolge für den kürzesten Pfad (oder einen von ihnen im Fall von Bindungen) für alle möglichen Quelltabellen zu drucken, sodass einspaltige Fremdschlüssel durchlaufen werden können, um die Zieltabelle zu erreichen. Das Skript scheint in der Datenbank mit ein paar tausend Tabellen und vielen FK-Verbindungen, an denen ich es ausprobiert habe, gut zu funktionieren.
Wie andere in den Kommentaren erwähnen, müssten Sie dies komplexer gestalten, wenn Sie mehrspaltige Fremdschlüssel verarbeiten müssen. Bitte beachten Sie auch, dass dies keinesfalls produktionsbereiter, vollständig getesteter Code ist. Ich hoffe, es ist ein hilfreicher Ausgangspunkt, wenn Sie sich entscheiden, diese Funktionalität auszubauen!
quelle
Sie können die Liste der Schlüssel einer Tabelle mit zwei Feldern TAB_NAME, KEY_NAME für alle Tabellen, die Sie verbinden möchten, einfügen.
Beispiel für Tabelle
City
ebenso
Province
undCountry
.Sammeln Sie die Daten für die Tabellen und fügen Sie sie in eine einzelne Tabelle ein (z. B. Metadatentabelle).
Zeichnen Sie nun die Abfrage wie folgt
Auf diese Weise erfahren Sie, wie Sie die Tabellen anhand der übereinstimmenden Schlüssel (gleiche Schlüsselnamen) verknüpfen können.
Wenn Sie der Meinung sind, dass der Schlüsselname möglicherweise nicht übereinstimmt, können Sie ein alternatives Schlüsselfeld einfügen und versuchen, es in der where-Bedingung zu verwenden.
quelle
sys
Tabellen in SQL Server verwenden wollte, die die Spalten in einer Tabelle beschreiben, wie Tabellen miteinander verknüpft sind usw. Alles, was bereits vorhanden ist. Das Erstellen eigener Tabellen, die Ihre Tabellenstruktur definieren, um einen bestimmten Bedarf zu erfüllen, könnte eine Ersatzposition sein, aber die bevorzugte Antwort würde das verwenden, was bereits vorhanden ist, wie es die akzeptierte Antwort tut.