Frage

Bei einer Quelltabelle und einer Zieltabelle möchte ich programmgesteuert eine Zeichenfolge mit allen erforderlichen Verknüpfungen erstellen.

Kurz gesagt, ich versuche einen Weg zu finden, eine Zeichenfolge wie diese 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 beim Versuch, 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.

War es hilfreich?

Lösung

Ich hatte ein Skript, das eine rudimentäre Version des ausländischen Key-Travers durchführt.Ich habe es schnell angepasst (siehe unten), und Sie können es möglicherweise als Startpunkt verwenden.

Angesichts einer Zieltabelle versucht das Skript, die Join-String für den kürzesten Pfad (oder eines von ihnen im Falle von Krawatten) für alle möglichen Quelltabellen zu druckenTabelle.Das Skript scheint in der Datenbank mit ein paar Tausend Tischen und vielen FK-Verbindungen gut zu funktionieren, auf denen ich es probiert habe.

Wenn andere in den Kommentaren erwähnt, müssen Sie dies komplexer machen, wenn Sie mit mehreren Säulen-Fremdschlüssel umgehen müssen.Bitte beachten Sie auch, dass dies keinermässige produktionsfertige, voll getestete Code bedeutet.Ich hoffe, es ist ein hilfreicher Ausgangspunkt, wenn Sie sich entscheiden, diese Funktionalität aufzubauen!

generasacodicetagpre.

Andere Tipps

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.

Beispiel für Tabelle City

  • Stadt/Stadt_name
  • Stadt/Land_name
  • Stadt/Provinz_name
  • Stadt/StadtCode

ebenso Province und Country.

Sammeln Sie die Daten für die Tabellen und in einer einzigen Tabelle ( zB.Metadatentabelle)

Entwerfen Sie nun die Abfrage wie folgt

select * from
(Select Table_name,Key_name from Meta_Data 
where Table_name in ('City','Province','Country')) A,
(Select Table_name,Key_name from Meta_Data 
where Table_name in ('City','Province','Country')) B,
(Select Table_name,Key_name from Meta_Data 
where Table_name in ('City','Province','Country')) C

where

A.Table_Name <> B.Table_name and
B.Table_name <> C.Table_name and
C.Table_name <> A.Table_name and
A.Column_name = B.Column_name and
B.Column_name = C.Column_name

Auf diese Weise erfahren Sie, wie Sie die Tabellen basierend auf den übereinstimmenden Schlüsseln (gleichen 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top