2016-07-15 13 views
2

Auf dieser Legacy-SQL Datenbank, ich brauche eine innere Verknüpfung auf alle Tabellen, deren Namen zu tun folgt ein Format:SQL Innen basierend auf Tabellennamen Muster mit Hunderten von Tabellen

  • barX_foo_bazX
  • barX_foo_bazY
  • barZ_foo_bazZ
  • ich innere möchte verbinden alle Tabellen mit foo in ihrem Namen

Ich bin mir nicht sicher, ob das überhaupt möglich ist.

Klar, mit dieser Syntax ist es nicht (aber es kann helfen, zu verstehen, was auf das ich bin mit dem Ziel):

USE [LegacyDB_Name] 

SELECT * 
FROM '%_foo_%' inner join '%_foo_%' 
where my_stuff_is(some condition) 

Irgendwelche Vorschläge? Ideen, wie ich das machen kann? Vielleicht gibt es einen einfacheren Weg dieser jungen Padawan nicht sieht ...

Vielen Dank!

+0

Nein, das ist nicht möglich. –

+0

@vetras: Wenn Sie mit Join-Bedingungen für jede Tabelle kommen oder wenn sie gleich sind, dann ist es möglich – TheGameiswar

Antwort

2

Ich bin nicht sicher, ob dies überhaupt möglich ist.

Nein, Tabellennamen dürfen keine Platzhalter enthalten oder verwenden, sie müssen Zeichenfolgen sein.

Mein Rat wäre, zu finden, was Programm diese Auswahlabfragen macht und beinhalten auch immer Muster, das Sie dort in den Abfragen müssen übereinstimmen.

Aber Ihre fertige Abfrage muss Tabellennamen als Zeichenfolgen enthalten.

+0

Nur ein Gedanke, was ist, wenn Sie Tabellennamen aus dem Schema mit einer 'mit'-Anweisung auswählen und diese vor der Ausführung verarbeiten die Abfrage in einer Funktion, so dass Sie ein Array von Strings haben, die vorher gefiltert wurden? – Tikkes

+0

@Tikkes Das ist was ich meine von "Einschließlich was auch immer Musterabgleich benötigen Sie in dem Programm, das die Abfragen erstellt". Verwenden Sie eine andere Information, um die Namen abzurufen, und führen Sie dann die Abfragen aus, aber die Abfragen müssen richtige Tabellennamen enthalten. – Magisch

1

Vielleicht ist der einfachste Weg, dies zu tun ist, einen Cursor auf die unten Abfrage und bauen eine dynamische SQL-Abfrage basiert zu erklären. Forschung tsql Cursor und dynamische SQL-Ausführung und es sollte ziemlich einfach sein.

SELECT * 
    FROM information_schema.tables 
    Where Table_Type = 'Base Table' And Table_Name Like '%_foo_%' 
1

Wenn Ihre Tabellen alle die gleiche Struktur (d. H. Spalten) haben, können Sie dies in zwei Schritten tun.

  1. generieren die SQL-Anweisung:

    select 'UNION ALL SELECT ''' + table_name + ''' AS table_name, * FROM ' 
         + table_name AS stmt 
    from information_schema.tables 
    where table_type = 'BASE TABLE' 
        and table_catalog = 'LegacyDB_Name' 
        and table_name LIKE '%foo%'; 
    

    Der Ausgang so etwas wie sein:

    stmt 
    -------------------------------------------------------------------- 
    UNION ALL SELECT 'barX_foo_bazX' AS table_name, * FROM barX_foo_bazX 
    UNION ALL SELECT 'barX_foo_bazY' AS table_name, * FROM barX_foo_bazY 
    UNION ALL SELECT 'barX_foo_bazZ' AS table_name, * FROM barX_foo_bazZ 
    

    Aus dieser Ausgabe, die SQL-Zeilen kopieren und die ersten 2 Wörter (UNION ALL) entfernen aus der ersten Zeile. Dies ist eine gültige SQL-Anweisung.

  2. Führen Sie die SQL-Anweisung abgeleitet oben

    Wenn Sie diese SQL benötigen öfter, dann eine Ansicht erstellen für sie:

    CREATE OR REPLACE VIEW all_foo AS 
           SELECT 'barX_foo_bazX' AS table_name, * FROM barX_foo_bazX 
        UNION ALL SELECT 'barX_foo_bazY' AS table_name, * FROM barX_foo_bazY 
        UNION ALL SELECT 'barX_foo_bazZ' AS table_name, * FROM barX_foo_bazZ; 
    

    Jetzt können Sie

    Abfrage wie
    SELECT * FROM all_foo WHERE ... 
    
Verwandte Themen