Algorithmus zum Formatieren von SQL-Code

11

Ich benötige ein Tool (für den internen Gebrauch), das SQL-Code formatiert (SQL Server / MySQL).
Es gibt verschiedene Tools und Online-Websites von Drittanbietern, die dies tun, aber nicht genau, wie ich es brauche.

Deshalb möchte ich mein eigenes Tool schreiben, das meinen Anforderungen entspricht.

Erste Frage: Gibt es einen Standard oder eine Konvention für die Formatierung des SQL-Codes? (Die Tools, die ich ausprobiert habe, formatieren es anders)

Die zweite Frage, wie soll ich diese Aufgabe angehen? Sollte die SQL-Abfrage zunächst in eine Datenstruktur wie einen Baum konvertiert werden?

Jullins
quelle

Antworten:

2

... gibt es einen Standard oder eine Konvention für die Formatierung des SQL-Codes?

Standard, nein. Für einen SQL-Parser können Sie eine gesamte SQL-Anweisung in eine Zeile setzen.

Konvention, sicher gibt es viele. Dies hängt davon ab, ob Sie versuchen, die Änderbarkeit zu maximieren oder den Speicherplatz zu minimieren. Ich habe für beide Fälle SQL-Formatierer geschrieben.

Ich habe nur bestimmte Zeichenkombinationen verwendet, um zu erfahren, wo die SQL-Anweisung gebrochen werden soll.

Hier ist ein Beispiel aus einem Java DB2 SQL-Formatierer , den ich geschrieben habe. Ein anderes Java-Programm hat den Java-Code generiert. Das SQL kam direkt aus den SYSIBMTabellen.

protected void prepareIndex00Select(String codeFacl)
        throws SQLException {
    StringBuffer sb = new StringBuffer();
    sb.append("SELECT CODE_FACL, SEQ_FACL, FILLER_TOF ");
    sb.append("    , CODE_TOF, NAME_FACL, NAME_LENGTH ");
    sb.append("    , CODE_FMB, ID_NCIC_ORI, NBR_PRINTER_PREFIX ");
    sb.append("    , ID_PERSONNEL_OFC, COMPLEX_CODE ");
    sb.append("    , PHS_CODE, DESIG_FACL_GRP, IND_DESIG_AUTH ");
    sb.append("    , CODE_FACL_I_T, INTKEY_FACL, IND_CDM_SENTENCING ");
    sb.append("    , MAL_FEM_IND, DEL_AFTER, IND_INMATES ");
    sb.append("    , VALUE_SO_CPU_STD, VALUE_SO_CPU_DAY ");
    sb.append("    , CODE_CAT, VALUE_DCN, XIDBKEY ");
    sb.append("    , FACL_FK_REGN ");
    sb.append("  FROM ");
    sb.append(creator);
    sb.append(".FACL ");
    sb.append("  WHERE CODE_FACL = ? ");
    if (additionalSQL != null) sb.append(additionalSQL);

    psIndex00 = connection.prepareStatement(sb.toString());
    psIndex00.setString(1, codeFacl);

}   // End prepareIndex00Select method
Gilbert Le Blanc
quelle
Ist Ihr Produkt (der Formatierer) online verfügbar oder kann es heruntergeladen werden?
Jullins
@jullins: Nein. Ich habe es geschrieben, um zu beweisen, dass ich eine Java-Anwendung schreiben kann, die Java-Klassen schreibt, sowie SQL aus der Datenbankspalte und den Indextabellen (SYSIBM) erstellt. Leider hat es niemand, mit dem ich arbeite, nützlich gefunden. Ich nehme an, ich könnte den Code irgendwo platzieren, wenn Sie wollen.
Gilbert Le Blanc
Ich würde es begrüßen, ich möchte nur den Formatierungsteil sehen.
Jullins
@jullins: Ich bin gerade auf der Arbeit, daher kann ich nicht auf öffentliche Repositories zugreifen. Ich werde den Code dieses Wochenende irgendwo aufstellen und Sie wissen lassen, wie Sie darauf zugreifen können.
Gilbert Le Blanc
Was ist mit dem Code? Kannst du es irgendwo hinstellen?
Jullins
2

Ein bisschen spät, bin gerade erst darüber gestolpert, sorry.

Der T-SQL-Formatierer von Poor Man ist ein Open-Source-T-SQL-Formatierer (Bibliothek, SSMS-Plugin, Befehlszeilendateiformatierer usw.). Die Implementierung ist relativ modular und es sollte nicht sehr schwierig sein, einen MySQL-Tokenizer und -Formatierer zu implementieren um mit den T-SQL-Versionen übereinzustimmen (ich habe dies nicht in erster Linie getan, weil ich momentan keine Erfahrung mit oder Verwendung für MySQL habe, daher ist es keine gute Nutzung meiner Zeit).

Die Bibliothek ist in C # (2.0) mit einer AGPL-Lizenz implementiert. Das bedeutet, dass Sie sie nicht kommerziell weitergeben oder als öffentlichen Dienst verfügbar machen können, ohne Änderungen zu veröffentlichen. Für interne Benutzer sollten jedoch keine Probleme auftreten, unabhängig davon, ob sie angepasst oder angepasst wurden nicht.

Wie @Gilbert Le Blank bereits antwortete, gibt es definitiv keinen Standard für die SQL-Formatierung - selbst die kommerziellen Formatierer mit den verschiedenen Optionen konvergieren nicht mit denselben Standardeinstellungen oder unterstützen notwendigerweise dieselben Ausgabeformate.

In Bezug auf das Schreiben Ihres eigenen Tools von Grund auf würde ich davon abraten, wenn Sie eine Vielzahl von Fällen behandeln müssen: Zumindest für T-SQL, die Behandlung von SQL-Stapel mit mehreren Anweisungen mit CTE WITH-Klauseln, MERGE-Anweisungen, Unterabfragen und abgeleitete Tabellen usw. erweisen sich als ziemlich schwierig :)

Falls es Hilfe gibt: http://www.architectshack.com/PoorMansTSqlFormatter.ashx

Tao
quelle