Comment puis-je vérifier la syntaxe SQL dans un fichier.sql?

Comment puis-je vérifier la syntaxe SQL dans un .fichier sql?

22
demandé sur Christopher Klein 2009-06-05 19:29:10

7 réponses

Vous pouvez le coller dans un navigateur de requête comme le navigateur de requête MySQL (partie du package GUI Tools) et inspecter visuellement la couleur des mots-clés et des littéraux de chaîne pour voir plus facilement si vous avez fait des erreurs de syntaxe.

Http://dev.mysql.com/downloads/gui-tools/5.0.html

1
répondu Hardwareguy 2009-06-05 21:53:41

Le lexer de base semble être implémenté dans sql / sql_lex. cc. vous pouvez utiliser / récupérer ceci pour construire votre propre analyseur de test. Mais cela ne vérifierait que la syntaxe mais pas les erreurs d'exécution.

4
répondu VolkerK 2009-06-05 21:48:24

Il existe quelques produits gratuits / try-ware qui vous permettront de vous connecter à une base de données MySQL ou simplement de coller dans le script pour le valider. Google est votre ami ici. Mimer vérifiera la validation de la syntaxe Standard ANSI mais ne gérera probablement pas les spécificités MySQL.

2
répondu Christopher Klein 2009-06-05 15:48:08

Il suffit de l'exécuter....

Début de la transaction

exécuter

Restauration

1
répondu KM. 2009-06-05 15:42:22

Il y a quelques possibilités. Si vous utilisez des tables InnoDB qui prennent en charge les transactions, vous pouvez simplement exécuter un start transaction; Au début de votre .fichier sql et un rollback; à la fin. MySQL affichera toutes les erreurs de syntaxe.

Si vous testez des instructions UPDATE ou DELETE, vous pouvez ajouter LIMIT 0 à la fin pour empêcher ces requêtes d'apporter des modifications à la base de données, et MySQL vérifie toujours la syntaxe.

1
répondu Travis Beale 2009-06-05 15:43:00

TLDR:

>awk '{print "EXPLAIN " $0}' statements.sql | mysql --force -u user -p database | grep "ERROR"

Curieusement, mysql n'a pas de commutateur intégré pour cela, mais vous pouvez vérifier la syntaxe en ajoutant l'instruction EXPLAIN devant vos requêtes.

Si vous avez un fichier statements.sql avec chaque instruction sur une ligne, ajoutez EXPLAIN devant toutes les lignes avec:

>awk '{print "EXPLAIN " $0}' statements.sql > check.sql

Vous pouvez ensuite exécuter les instructions avec l'outil de ligne de commande mysql et utiliser --force pour qu'elles continuent en cas d'erreur. Il imprimera une erreur pour toutes les instructions avec incorrect syntaxe.

>mysql --force -u user -p database < check.sql

Ou pour afficher uniquement les lignes avec des erreurs:

>mysql --force -u user -p database < check.sql | grep "ERROR"

Vous pouvez faire tout cela sur une ligne sans créer de fichier intermédiaire:

>awk '{print "EXPLAIN " $0}' statements.sql | mysql --force -u user -p database | grep "ERROR"
1
répondu culix 2016-05-04 06:17:07

SELECT STATEMENT_DIGEST_TEXT dans MySQL 8.0 peut être utilisé pour la validation de la syntaxe de requête MySQL.

8.0.4>SELECT STATEMENT_DIGEST_TEXT('FLUSH TABLES')\G
STATEMENT_DIGEST_TEXT('FLUSH TABLES'): FLUSH TABLES 

8.0.4>SELECT STATEMENT_DIGEST_TEXT("SET GLOBAL second_cache.key_buffer_size=128*1024;")\G
STATEMENT_DIGEST_TEXT("SET GLOBAL second_cache.key_buffer_size=128*1024;"): SET GLOBAL `second_cache` . `key_buffer_size` = ? * ? ;

8.0.4>SELECT STATEMENT_DIGEST_TEXT("create TABLE t1 ( a2 int unsigned not null, b2 int unsigned not null, c2 int unsigned not null, primary key (a2), index b2x (b2), index c2x (c2) ) ENGINE=MEMORY;")\G
STATEMENT_DIGEST_TEXT("create TABLE t1 ( a2 int unsigned not null, b2 int unsigned not null, c2 int unsigned not null, primary key (a2), index b2x (b2), index c2x (c2) ) ENGINE=MEMORY;"): CREATE TABLE `t1` ( `a2` INTEGER UNSIGNED NOT NULL , `b2` INTEGER UNSIGNED NOT NULL , `c2` INTEGER UNSIGNED NOT NULL , PRIMARY KEY ( `a2` ) , INDEX `b2x` ( `b2` ) , INDEX `c2x` ( `c2` ) ) ENGINE = MEMORY ; 

Si le SQL N'est pas pris en charge, vous obtiendrez une erreur. Comme le suivant, mais il y a quelque chose de spécial dans cette réponse;

8.0.4>SELECT STATEMENT_DIGEST_TEXT('HELP SELECT')\G
ERROR 3676 (HY000): Could not parse argument to digest function: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT' at line 1".

Avez-vous vu ce qui était spécial? C'est le fait que 'HELP' est un mot-clé valide, mais uniquement côté client - pas un mot-clé serveur. Dans tous les cas, une instruction SQL invalide produira une situation similaire; une erreur.

Ainsi, vous pouvez vérifier en fonction de L'erreur vs aucune erreur à savoir si la syntaxe SQL passée est valide ou non (à l'exclusion de l'ensemble très limité de commandes côté client uniquement, mais celles-ci ne seraient pas d'intérêt pour la plupart des gens).

Summary; SELECT STATEMENT_DIGEST_TEXT est un analyseur SQL complet (bien que ce ne soit pas sa fonction directe/prévue) qui peut être utilisé dans tous les cas pour vérifier la validité des instructions rapidement et sans les exécuter réellement. C'est un énorme progrès en ce qui concerne la validation de la validité SQL.

Notez que vous devez avoir un Serveur MySQL opérationnel pour cela. Vous pouvez passer des requêtes en utilisant le client mysql -e, ou un tuyau à mysql etc.

0
répondu Roel 2018-04-06 22:53:58