Algorithme de formatage du code SQL

11

J'ai besoin d'un outil (pour une utilisation interne) qui formatera le code SQL (SQL Server / MySQL).
Il existe différents outils tiers et sites Web en ligne qui le font, mais pas exactement comment j'en ai besoin.

Je veux donc écrire mon propre outil qui répondra à mes besoins.

La première question est-il une norme ou une convention sur la façon dont le code SQL doit être formaté? (les outils que j'ai essayé de formater différemment)

La deuxième question, comment dois-je aborder cette tâche? Faut-il d'abord convertir la requête SQL en une structure de données comme un arbre?

jullins
la source

Réponses:

2

... existe-t-il une norme ou une convention pour la mise en forme du code SQL?

Standard, non. Vous pouvez placer une instruction SQL entière sur une seule ligne en ce qui concerne un analyseur SQL.

Convention, bien sûr il y en a beaucoup. Cela dépend si vous essayez de maximiser la modification ou de minimiser l'espace. J'ai écrit des formateurs SQL pour les deux cas.

J'ai juste utilisé des combinaisons de caractères particulières pour me dire où rompre l'instruction SQL.

Voici un exemple d'un formateur SQL Java DB2 que j'ai écrit. Un autre programme Java a généré le code Java. Le SQL provenait directement des SYSIBMtables.

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
la source
Votre produit (le formateur) est-il disponible en ligne ou à télécharger?
jullins
@jullins: Non. Je l'ai écrit juste pour prouver que je pouvais écrire une application Java qui écrit des classes Java, ainsi que construire le SQL à partir de la colonne de base de données et des tables d'index (SYSIBM). Malheureusement, personne avec qui je travaille ne l'a trouvé utile. Je suppose que je pourrais mettre le code quelque part si vous voulez.
Gilbert Le Blanc
Je l'apprécierais, je veux juste voir la partie formatage.
jullins
@jullins: Je suis au travail maintenant, donc je ne peux pas accéder aux dépôts publics. Je mettrai le code quelque part ce week-end et je vous dirai comment y accéder.
Gilbert Le Blanc
qu'en est-il du code? Pouvez-vous le mettre quelque part?
jullins
2

Un peu tard, je suis juste tombé dessus, désolé.

Le formateur T-SQL de Poor Man est un formateur T-SQL open source (bibliothèque, plug-in ssms, formateur de fichier de ligne de commande, etc.) - l'implémentation est raisonnablement modulaire et il ne devrait pas être très difficile d'implémenter un tokenizer et un formateur MySQL pour correspondre à ceux de T-SQL (je ne l'ai pas fait principalement parce que je n'ai aucune expérience ou utilisation de MySQL pour le moment, donc ce n'est pas une bonne utilisation de mon temps).

La bibliothèque est implémentée en C # (2.0) avec une licence AGPL - ce qui signifie que vous ne pouvez pas la redistribuer commercialement ou exposer en tant que service public sans publier de modifications, mais pour les utilisateurs internes, elle ne devrait présenter aucun problème, qu'elle soit personnalisée ou ne pas.

Comme @Gilbert Le Blank a déjà répondu, il n'y a certainement pas de norme sur le formatage SQL - même les formateurs commerciaux là-bas, avec les différentes options qu'ils fournissent, ne convergent pas sur les mêmes valeurs par défaut ou même prennent nécessairement en charge les mêmes formats de sortie.

En ce qui concerne l'écriture de votre propre outil à partir de zéro, je vous déconseille si vous avez besoin de gérer une variété de cas: au moins pour T-SQL, gérer des lots SQL multi-instructions avec des clauses CTE WITH, des instructions MERGE, des sous-requêtes et les tables dérivées, etc. se révèlent assez difficiles :)

Dans le cas où c'est une aide: http://www.architectshack.com/PoorMansTSqlFormatter.ashx

Tao
la source