Generieren Sie SQL mit Powershell & Regex

Sep 14 2020

Ich habe die folgende ddl-Struktur (Data Definition Language) in SQL:

CREATE TABLE tablename(
 key ...,
 key1 ...,
 u_version ...,
 field1 ...,
 field2 ...
)
CREATE UNIQUE clustered... (key ASC, key1 ASC)

Da ich mit dieser Struktur mehrere Tabellen erstellen möchte , unterscheiden sich nur die Namen von Tabellen, Schlüsseln und Feldnamen . Daher möchte ich das Powershell-Skript verwenden, um jede Datei im Verzeichnis zu scannen und ein SQL-Skript für jede Datei zu generieren. Das generierte Skript sollte folgendermaßen aussehen:

INSERT INTO tablename(key, key1, u_version, field1, field2)
SELECT key, key1, field1, field2
FROM tablename_temp t
WHERE NOT EXISTS (SELECT key, key1
                  FROM tablename l
                  WHERE l.key = t.key AND l.key1 = t.key1) 

Für Tabellenname & Tabellenname_Tempdb verwende ich Folgendes:

switch -Regex ( $line ) { '(^\s*create\s+table\s+)(?<tablename>[^(]*)' { $table_name = $matches["tablename"] $table_name_tempdb="${table_name}_tmp"
        break
        }
    }

Jetzt möchte ich dasselbe mit Schlüsseln und anderen Feldern machen. Gibt es irgendwelche Vorschläge?

Meine Idee ist es, alle Zeilen von der TABELLE ERSTELLEN nach ")" zu scannen und jedes Wort hinzuzufügen, das mit "" beginnt und mit "" in einer Liste endet. Zeilen vor u_version sind Schlüssel, die anderen werden als Felder betrachtet und erstellen mit diesen eine Abfrage.

Antworten

1 Graham Sep 14 2020 at 22:51

Hier ist ein Arbeitsbeispiel, das auf den bereitgestellten Informationen basiert und das neue SQL ausgibt.

Ich habe Sie SQL optimiert (Ihre Einfügung, wie sie ist, wäre fehlgeschlagen). Wenn sich Ihre Eingabedateien von Ihrem Beispiel unterscheiden, muss der Ausdruck angepasst werden.

Durch das Lesen von Inhalten mit -Raw kann die gesamte Datei zusammen analysiert werden.

dir *.sql  |%{
    $filecontents = Get-Content $_.FullName -Raw

    $matches = [Regex]::Match($filecontents, "CREATE TABLE (?'tablename'[^( ]+)\((\W+(?'key'\w+)\W(?'type'[^,)])+[,)])+(\W+u_version\W([^,)])+[,)])(\W+(?'field'\w+)\W(?'type'[^,)])+[,)])+\W+CREATE UNIQUE")

    $tablename = $matches.Groups["tablename"].Value
    $keys = $matches.Groups["key"].Captures.Value
    $fields = $matches.Groups["field"].Captures.Value


'=================================================================='
@"
INSERT INTO $tablename($($keys -join ','), u_version, $($fields -join ',')) SELECT $($keys -join ','), u_version, $($fields -join ',') FROM $($tablename)_temp t WHERE NOT EXISTS (SELECT 1 FROM $tablename l
                  WHERE $(($keys |% { "l.$_ = t.$_" }) -join ' AND ')) 
                 

"@

}