2011-09-30 6 views
0

Situation: J'ai plusieurs rapports SSRS dont j'ai besoin de documenter le code sql. Pour cela, j'ai besoin que le code soit reformaté exactement de la même manière.sql imbriqué select parsing

Problème: Dans certains de mes rapports, j'ai des structures comme

select outer 
from (
select outin 
from (
select inner 
from (
select innerMax 
from 
)z 
where 
)x 
where dateadd(d,12,getdate()) 
)y 
where 

Et je veux que le résultat soit

select outer 
from (
    select outin 
    from (
     select inner 
     from (
      select innerMax 
      from 
     )z 
     where 
    )x 
    where dateadd(d,12,getdate()) 
)y 
where 

Mais j'ai des problèmes avec Indentation de la nichée select de

J'apprécierais vraiment si vous pouvez me fournir des exemples. Je l'ai utilisé, scissions, regex sous-chaînes, ...

salutations

+0

La chance que les requêtes auront sql-ressemblance est assez faible. En voyant sur quelle base de données il est signifié, il n'y a aucun moyen qu'il y aura des littéraux de chaîne qui ressemblent à sql. En ce qui concerne les commentaires: J'écris mon code sans commentaires, et le formate afin qu'il puisse être documenté dans un fichier externe (pratique semi-mauvaise, je sais) – ShadowFlame

+0

Toujours, en utilisant un outil existant qui est fait pour cela (un analyseur SQL) est préféré par l'OMI. Vois ma réponse. –

Répondre

1

C'est plus délicat que vous pourriez penser: split, et sous-chaîne regex ne sera pas suffisant pour lutter contre ce problème de manière fiable. Considérez des commentaires, ou des littéraux de chaîne à l'intérieur de votre code SQL qui pourraient contenir du texte ressemblant à SQL ou contenant des parenthèses qui gâcheraient vos niveaux d'indentation.

Une meilleure solution consiste à utiliser un analyseur SQL. Voici une démo avec python-sqlparse:

#!/usr/bin/env python 
import sqlparse 

sql = """ 
select outer 
from (
select outin 
from (
select inner 
from (
select innerMax 
from 
)z 
where 
)x 
where dateadd(d,12,getdate()) 
)y 
where 
""" 

print sqlparse.format(sql, reindent=True) 

qui imprimera:

select outer 
from 
    (select outin 
    from 
    (select inner 
     from 
     (select innerMax 
     from)z 
     where)x 
    where dateadd(d,12,getdate()))y 
where