Algoritmo per la formulazione del codice SQL


11

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 ne ho bisogno.

Quindi voglio scrivere il mio strumento adatto alle mie esigenze.

La prima domanda esiste uno standard o una convenzione su come formattare il codice SQL? (gli strumenti che ho provato a formattarlo in modo diverso)

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

Risposte:


2

... esiste uno standard o una convenzione per la formattazione del codice SQL?

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

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

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

Ecco un esempio da un formattatore SQL DB2 Java che ho scritto. Un altro programma Java ha generato il codice Java. L'SQL proviene direttamente dalle SYSIBMtabelle.

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

Il tuo prodotto (il formatter) è disponibile online o da scaricare?
jullins,

@jullins: No. L'ho scritto solo per dimostrare che potevo scrivere un'applicazione Java che scrive le classi Java, oltre a costruire l'SQL dalla colonna del database e dalle tabelle degli indici (SYSIBM). Purtroppo, nessuno con cui lavoro lo ha trovato utile. Suppongo che potrei mettere il codice da qualche parte se vuoi.
Gilbert Le Blanc,

Lo apprezzerei, voglio solo vedere la parte di formattazione.
jullins,

@jullins: ora sono al lavoro, quindi non posso accedere ai repository pubblici. Metterò il codice da qualche parte questo fine settimana e ti farò sapere come accedervi.
Gilbert Le Blanc,

che dire del codice? Puoi metterlo da qualche parte?
jullins,

2

Un po 'tardi, mi sono appena imbattuto in questo, scusa.

Poor Man's T-SQL Formatter è un formattatore T-SQL open source (libreria, plugin ssms, formattatore di file da riga di comando, ecc.) - l'implementazione è ragionevolmente modulare e non dovrebbe essere molto difficile implementare un tokenizer e un formatter MySQL per abbinare quelli 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 esporla come servizio pubblico senza pubblicare alcuna modifica, ma per gli utenti interni non dovrebbe presentare problemi, sia personalizzati che non.

Come ha già risposto @Gilbert Le Blank, non esiste assolutamente uno standard per la formattazione SQL: anche i formattatori commerciali là fuori, con le diverse opzioni che offrono, non convergono sugli stessi valori predefiniti o supportano necessariamente gli stessi formati di output.

Per quanto riguarda la scrittura del tuo strumento da zero, ti sconsiglio se è necessario gestire una varietà di casi: almeno per T-SQL, gestione di batch multiistruzione SQL con clausole CTE WITH, istruzioni MERGE, sottoquery e tabelle derivate, ecc. risultano essere piuttosto difficili :)

Nel caso sia di aiuto: http://www.architectshack.com/PoorMansTSqlFormatter.ashx

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.