... 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 SYSIBM
Tabellen.
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
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
quelle