Algoritmo per la formattazione del codice SQL

10

Ho bisogno di uno strumento (per uso interno) che formatta il codice SQL (SQL Server / MySQL).
Ci sono vari strumenti di terze parti e siti web online che lo fanno ma non esattamente come ho bisogno.

Quindi voglio scrivere il mio strumento che si adatta alle mie esigenze.

Prima domanda c'è qualche standard o una convenzione su come il codice SQL dovrebbe essere formattato? (gli strumenti che ho provato lo formattano in modo diverso)

La seconda domanda, come devo affrontare questo compito? Dovresti prima convertire la query sql in una struttura di dati come un albero?

    
posta jullins 14.10.2011 - 13:49
fonte

2 risposte

2

Un po 'tardi, ci siamo solo imbattuti in questo, mi dispiace.

Il former T-SQL di Poor Man è un formattatore T-SQL open source (libreria, plug-in ssms, formatter file-riga di comando, ecc.): l'implementazione è ragionevolmente modulare e non dovrebbe essere molto difficile implementare un MySQL tokenizer e formatter per abbinare quelli di T-SQL (non l'ho fatto principalmente perché non ho esperienza o utilizzo per MySQL in questo momento, quindi non è un buon uso del mio tempo).

La libreria è implementata in C # (2.0) con una licenza AGPL - ciò significa che non è possibile ridistribuirla commercialmente o esporre come servizio pubblico senza pubblicare alcuna modifica, ma per l'utente interno non dovrebbe presentare problemi, sia è personalizzato o no.

Come già risposto a @Gilbert Le Blank, non c'è sicuramente uno standard sulla formattazione SQL - anche i formattatori commerciali disponibili, con le diverse opzioni che forniscono, non convergono sugli stessi valori di default o addirittura supportano necessariamente gli stessi formati di output .

Per quanto riguarda la scrittura da zero del tuo strumento, vorrei sconsigliarlo se hai bisogno di gestire una varietà di casi: almeno per T-SQL, gestendo lotti multi-statement SQL con clausole CTE WITH, istruzioni MERGE, sub -query e tabelle derivate, ecc risulta essere piuttosto difficile:)

In caso di aiuto: link

    
risposta data 16.02.2012 - 10:42
fonte
1

...is there any standard or a convention for how the SQL code should be formatted?

Standard, no. È possibile inserire un'intera istruzione SQL su una riga per quanto riguarda un parser SQL.

Convenzione, certo che ci sono molti. Dipende se stai cercando di massimizzare la variabilità o minimizzare lo spazio. Ho scritto i formattatori SQL per entrambi i casi.

Ho appena usato particolari combinazioni di caratteri per dirmi dove interrompere l'istruzione SQL.

Ecco un esempio di un programma di formattazione Java DB2 SQL che Scrissi. Un altro programma Java ha generato il codice Java. L'SQL proveniva direttamente dalle tabelle SYSIBM .

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
    
risposta data 14.10.2011 - 15:17
fonte

Leggi altre domande sui tag