2016-03-22 4 views
1

Wir verwenden ERWin für die Datenmodellierung und es generiert eine große SQL-DDL-Dateien für alle Datenbankobjekte, wie Tabellen und Ansichten. Ich denke daran, diese große Datei in kleine zu zerlegen, die zum Beispiel jeweils eine Tabelle, eine Ansicht enthalten.Windows Powershell: kann ich eine große SQL-Datei in kleine Dateien mit einem DB-Objekt teilen

Ziel ist es, die manuelle Arbeit bei der Bereitstellung von SQL DDLs mit Kopieren/Einfügen jeder Tabelle in ein Ausführungsfenster zu reduzieren, da in der Entwicklung in der Regel nur ein paar Tabellen geändert werden.

Ich sehe, dass jedes SQL mit einem Semikolon endet, ";" Ich hoffe, dass es in PowerShell einen Weg gibt, dieses Trennzeichen zu finden und die große SQL-Datei in viele kleine zu trennen.

Vielen Dank für Ihre Hilfe!

Hier ist ein Beispiel SQL-Code mit zwei Tabellen.

CREATE SET TABLE TABLE_1, 
    NO BEFORE JOURNAL, 
    NO AFTER JOURNAL, 
    NO FALLBACK, 
    CHECKSUM = DEFAULT 
(

    CAT_ID   INTEGER NOT NULL , 
    CAT_SECTION_ID INTEGER NOT NULL , 
    CREATE_DTTM   TIMESTAMP(6) NOT NULL , 
    UPDATE_DTTM   TIMESTAMP(6) NULL 
) 
    UNIQUE PRIMARY INDEX UPI_CAT_SECTION 
    (
      CAT_ID, 
      CAT_SECTION_ID 
    ); 

CREATE SET TABLE TABLE_2, 
    NO BEFORE JOURNAL, 
    NO AFTER JOURNAL, 
    NO FALLBACK, 
    CHECKSUM = DEFAULT 
(

    CH_NUM   VARCHAR(8) NOT NULL , 
    CH_YEAR SMALLINT NOT NULL , 
    CREATE_DTTM   TIMESTAMP(6) NOT NULL , 
    LAST_UPDATE_DTTM  TIMESTAMP(6) NULL 
) 
    UNIQUE PRIMARY INDEX UPI_TABLE_2 
    (
      CH_NUM, 
      CH_YEAR, 
       ); 
+0

„, weil in der Entwicklung, in der Regel nur ein paar Tabellen werden geändert "Ich schlage vor, dass Sie ein Werkzeug verwenden, das 'differentielle' Skripte erstellen kann, wie das in Visual Studio enthaltene (Schemavergleich). Dann erzeugt es nur das Skript, das Sie zum Synchronisieren von Datenbanken benötigen und Sie brauchen nicht alle Diese manuelle Arbeit, um die Dinge auszurichten. Sie müssen vielleicht Ihren gesamten Deployment/Build-Prozess etwas detaillierter erklären. –

+0

Dies kann mit Powershell erreicht werden, aber ich kann keine Beispiele mit out Sam geben ple Daten. Sie sollten einfach $ Query.Split (";") verwenden können – Nick

Antwort

2

Hier ist ein Skript, das Ihre große Datei in kleinere Dateien aufteilt und nach jeder Zeile, die ein Semikolon enthält, eine neue Datei startet. Er erzeugt die Dateinamen basierend auf der ersten nicht-leere Zeile das Semikolon folgt zusammen (in Ihrem Beispiel die beiden Dateinamen CREATE_SET_TABLE_CATALOG.SQL und CREATE_SET_TABLE_CHASSIS.SQL wären.

$buffer = @() 
$filename = $null 
Get-Content '.\LARGEFILE.SQL' | ForEach-Object { 
    $line = $_ 
    $buffer += @($line) 

    if ([String]::IsNullOrWhiteSpace($filename)) { 
     $filename = $line.Trim().Replace(',','') -replace '[^a-zA-Z0-9_.]+', '_' 
    } 

    if ($line.Contains(';')) { 
     $buffer | Out-File "$filename.SQL" -Encoding utf8 
     $buffer = @() 
     $filename = $null 
    } 
} 
+0

Das ist perfekt. Das nächste Feature, das ich hinzufügen werde, ist, die "create set table" aus den Dateinamen zu entfernen, so dass ich alle SQL-Skripte problemlos nach Tabellennamen sortieren kann. Ich danke dir sehr! – dave

2

Wenn Sie nur wollen den Text nach oben in Stücke aufgeteilt, die durch Semikolons sauber abgegrenzt sind, wird Nicks Empfehlung arbeiten. $ Query.Split („;“)

http://ss64.com/ps/split.html

Sie könnten Ihre eigenen Vergleichs-Tool aus dem aufgespalten Skript rollen, aber es kann einfacher sein, nur NotePadd ++ 's vergleichen Werkzeug zu vergleichen, die letzte deploy auf die Verwendung neuer Code.
https://sourceforge.net/projects/npp-compare/

Verwandte Themen