2015-11-20 2 views
1

J'essaie d'utiliser le pyparsing (lib) pour analyser et récupérer toutes les tables/vues utilisées dans les instructions SQL. Et j'essaie d'utiliser le code select_parser.py disponible avec cette librairie pyprasing.pyparsing pour les sqls complexes

J'ai besoin d'aide pour comprendre les modifications que je dois apporter au code select_parser.py pour obtenir la sortie mentionnée ci-dessous.

Je veux analyser la requête ci-dessous et obtenir toutes les tables utilisées à partir de la chaîne.

Select 
     Col 1, 
     Col 2 
     Col3, 
     (select top 1 name from tableX) as Col4, 
     col5 
from 
     table1 a 
     left join table2 b on a.id = b.id 
     right join table3 c on a.id = c.id 
     left join 
       (select id from table4) as d 
     on c.id = d.id 

Sortie prévue

TABLEx, table1, table2, table3, table4

Répondre

0

Le problème est que la définition de 'identifiant' tel qu'il est utilisé dans l'expression de comparaison ne comprendre les noms qualifiés de points.

Fix en changeant terme expr de

expr_term = (
    CAST + LPAR + expr + AS + type_name + RPAR | 
    EXISTS + LPAR + select_stmt + RPAR | 
    function_name + LPAR + Optional(delimitedList(expr)) + RPAR | 
    literal_value | 
    bind_parameter | 
    identifier 
    ) 

à

expr_term = (
    CAST + LPAR + expr + AS + type_name + RPAR | 
    EXISTS + LPAR + select_stmt + RPAR | 
    function_name + LPAR + Optional(delimitedList(expr)) + RPAR | 
    literal_value | 
    bind_parameter | 
    delimitedList(identifier, delim='.', combine=True) 
    ) 
+0

Ok, j'ai essayé de définir le schéma optionnel et utilisé comme ci-dessous 'single_source = ((bdd ("base de données") + ». "+ schema_name (" schéma ") +" "+ nom_table (" table ") | \t \t \t \t \t \t schema_name. (" schéma ") +" "+ nom_table (" table ") | nom_table (". Table »)) \t \t \t \t \t + en option (en option (AS) + table_alias ("table_alias")) + en option (Répertorié + BY + index_name ("name") | NOT + INDEXE) ("index") | (LPAR + select_stmt + RPAR + Facultatif (Facultatif (AS) + table_alias)) | (LPAR + join_source + RPAR)) 'encore je suis en train de déterminer les jointures seules. –

+0

Veuillez mettre ces fragments de code dans le corps de la question, PAS dans les commentaires. Ils sont plus faciles à lire et ne déclenchent pas les alarmes de «SO longs commentaires ne sont pas souhaitables». – PaulMcG

+0

Salut Paul, pouvez-vous s'il vous plaît m'aider à comprendre ce que les changements que je dois apporter au code obtiennent la sortie attendue. J'ai modifié la question avec un exemple plus clair. –