Algoritmo para formatear código SQL


11

Necesito una herramienta (para uso interno) que formatee el código SQL (SQL Server / MySQL).
Hay varias herramientas de terceros y sitios web en línea que lo hacen, pero no exactamente cómo lo necesito.

Por eso quiero escribir mi propia herramienta que se ajuste a mis necesidades.

Primera pregunta ¿hay algún estándar o una convención sobre cómo se debe formatear el código SQL? (las herramientas que probé lo formatean de manera diferente)

La segunda pregunta, ¿cómo debo abordar esta tarea? Al principio, ¿debería convertir la consulta SQL en alguna estructura de datos como un árbol?

Respuestas:


2

... ¿hay algún estándar o una convención sobre cómo se debe formatear el código SQL?

Estándar, no. Puede poner una declaración SQL completa en una línea en lo que respecta a un analizador SQL.

Convención, seguro que hay muchos. Depende de si está tratando de maximizar la capacidad de cambio o minimizar el espacio. He escrito formateadores SQL para ambos casos.

Acabo de usar combinaciones de caracteres particulares para decirme dónde romper la instrucción SQL.

Aquí hay un ejemplo de un formateador Java DB2 SQL que escribí. Otro programa Java generó el código Java. El SQL vino directamente de las SYSIBMtablas.

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

¿Su producto (el formateador) está disponible en línea o para descargar?
jullins

@jullins: No. Lo escribí solo para demostrar que podía escribir una aplicación Java que escriba clases de Java, así como para construir el SQL a partir de la columna de la base de datos y las tablas de índice (SYSIBM). Lamentablemente, nadie con quien trabajo lo ha encontrado útil. Supongo que podría poner el código en algún lugar si quieres.
Gilbert Le Blanc

Lo agradecería, solo quiero ver la parte de formato.
jullins

@jullins: ahora estoy en el trabajo, así que no puedo acceder a los repositorios públicos. Pondré el código en algún lugar este fin de semana, y le haré saber cómo acceder a él.
Gilbert Le Blanc

¿Qué pasa con el código? ¿Puedes ponerlo en alguna parte?
jullins

2

Un poco tarde, solo me topé con esto, lo siento.

El formateador T-SQL de Poor Man es un formateador T-SQL de código abierto (biblioteca, complemento ssms, formateador de archivos de línea de comandos, etc.): la implementación es razonablemente modular y no debería ser muy difícil implementar un tokenizador y formateador MySQL para que coincida con los T-SQL (no lo he hecho principalmente porque no tengo experiencia ni uso MySQL en este momento, por lo que no es un buen uso de mi tiempo).

La biblioteca se implementa en C # (2.0) con una licencia AGPL, lo que significa que no puede redistribuirla comercialmente o exponerla como un servicio público sin publicar ninguna modificación, pero para el usuario interno no debería presentar problemas, ya sea personalizada o no.

Como ya respondió @Gilbert Le Blank, definitivamente no hay un estándar en el formato SQL, incluso los formateadores comerciales que existen, con las diferentes opciones que proporcionan, no convergen en los mismos valores predeterminados o incluso necesariamente admiten los mismos formatos de salida.

Con respecto a escribir su propia herramienta desde cero, le aconsejaría que no lo haga si necesita manejar una variedad de casos: al menos para T-SQL, manejo de lotes de múltiples declaraciones SQL con cláusulas CTE WITH, declaraciones MERGE, subconsultas y tablas derivadas, etc. resulta ser bastante difícil :)

En caso de que sea de alguna ayuda: http://www.architectshack.com/PoorMansTSqlFormatter.ashx

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.