Newsgroup: it.comp.lang.visual-basic
Titolo: [SQL] Scomposizione comando SQL

Sto scrivendo una funzione che scompone una stringa/comando SQL in tutte le
sue parti (campi di select, espressioni, condizioni where, having, group by,
order by).
Ne ho la necessità, paradossalmente, per ricomporlo (chi mi segue, anche se
non mi ama, sa quali problemi sto cercando di risolvere).
La domanda (fatta dopo _breve_ ricerca) è molto semplice:
Sono un pazzo scatenato perchè esiste già del codice atto allo scopo
o sono semplicemente un pazzo?
Nel secondo caso lo sarò ancor di più pubblicandolo sul SC.

 Nel secondo caso lo sarò ancor di più pubblicandolo sul SC.
Speriamo che tu ci riesca allora... (potresti magari fare in fretta? ;-))

 Speriamo che tu ci riesca allora... (potresti magari fare in fretta? ;-))
Beh, devo (!), altrimenti sono bloccato.
Faccio conto di finire nel week-end

Lupo wrote:


Se stai tentando di scrivere una funzione che ti permette di trasformare
l'istruzione SQL costruita con Access o con la vista di SQL Server , in
stringa da utilizzare in editor VB , l' ho postata tempo fa.
Altrimenti non ho inteso.
giuseppeD
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Altrimenti non ho inteso.
No, non credo di essermi spiegato:
Io ho già un'istruzione SQL completa e la voglio scomporre in tutte le sue
parti sintattiche e di sezione, mettendole in stringhe separate.

 tempo fa. Altrimenti non ho inteso.
Vuole creare un parser SQl imho... Lungo e difficile direi! :(

 Non ci penso nemmeno a ...generare informazioni.
ehi, che distinzione e' ?
specie nel campo dell' _information_ technology...
mica vai a analizzare/scandire scatole di pelati :)
sbaglio o vuoi generare (ricavare da una massa +-confusa di bit)
informazioni relative a determinati -- chiamiamoli cosi' -- oggetti per
gestirli ?
cioe' vuoi fare un luparser :)
ciao, j.

 
http://www.itware.com/tool0002/24_25.htm
Ad una prima lettura , ottima teoria.
In pratica , ogni volta che mi trovo al termine del lavoro:
- Gestione degli errori ? Ma quanto tempo ancora occorre ? .....
 No , tanto il messaggio che produce VB si capisce.
- Si . Buona idea costruire una guida in linea, tempo previsto ? ...
Con word è più immediata . Mi raccomando non più di tre - quattro pagine,
l'essenziale.
- Immagazzinare il codice per utilizzazioni successive ?
Le informazioni si trasmettono parlando. Tra voi non vi parlate ?
ecc. ecc. ecc.


 cioe' vuoi fare un luparser :)
Cercherò di essere breve e, possibilmente, chiaro:
Sapete che in ADO+adUseServer+adOpenDynamic ho velocità, ma non ho il Clone,
nè il RecordCount. OK, partendo da questo diciamo che ho la necessità di
surrogare il RecordCount rieseguendo il comando SQL modificato per farne un
Count e depositando una stored procedure che mi esegue questo secondo
comando. Tutto fatto e OK. Il problema vero è questo: La mia SQL originaria
è stata mastirbata più volte dall'operatore che ha potuto fare selezioni in
griglia, anche in cascata e un certo ordinamento. Quelle selezioni (che
mantengo una per una separate e in cascata) io non le posso fare con un
.Filter (penoso come velocità), ma aggiungendole al comando SQL originario
nella sezione Where. Analogamente (si pensi a dover stampare la griglia
ordinata come piace all'operatore senza poter usare il Clone e senza poter
scorrere il recordset perchè si perderebbe il record corrente e
irrecuperabile) l'ultimo ordinamento fatto non lo posso applicare con un
.Sort, ma devo modificare/accodare una clausola ORDER BY nel comando SQL
originario, poi masturbato con le selezioni e così via.
Arrivo al dunque: Io ho in memoria l'SQL originario, tutte le singole
selezioni e l'ultimo ordinamento. Per poter integrare queste cose allo scopo
di ottenere un comando SQL unico capace di riprodurmi la situazione (per
contare i record, per stamparlo) devo "integrare" le novità (Where e Order
By) nell'SQL originario che magari ha già le sue Where e la sua Order By.
Quindi l'idea è questa: Io scompongo in tutte le sue parti il comando SQL
originario e lo ricostruisco a pezzetti inserendo nelle sezioni corrette le
nuove richieste dell'operatore. A questo punto ho un _unico_ comando SQL che
posso eseguire tranquillamente. Uffffff!

 dall'esecuzione dell'SQL stessa.
un parser quello fa: ti restituisce stringhe. tag html, o quello che vuoi. i
dati li restituisce la query. imho, tu vuoi scandire (parserare? brrr...) la
query.
ciao, j.escape

 query.
Esatto! ... E la sezione Select è fatta (con parentesi tonde e quadre, " AS
", puntini, spazi) WooooW!


Credo che esista del codice alla MS, alla Oracle, in IBM ... ;-)
ciao
		maxx

 Credo che esista del codice alla MS, alla Oracle, in IBM ... ;-)
Dai, dai, prendetemi pure in giro... ;-)))

 ha scritto nel messaggio
news:bLYS8.77826$Kt3.1...@twister2.libero.it...


 se vuoi una mano.....
Andrea, grazie 10^6. Sě, approfitterň volentieri, in particolare per le
sintassi di T-SQL (vari @ e caratteri "strani" in genere) che io non conosco
a fondo e quindi, piů di tanto, non riesco a prevederla. Ora mi sto
limitando alla sintassi classica (SQL per Access, per intenderci).
Le sezioni Select e From sono fatte. Oggi/domani finisco Where, Group By,
Having e Order By (se non incontro grossi ostacoli) e, dopo un po' di test,
i primissimi giorni della settimana prossima manderň al WM e, in attesa
dell'eventuale pubblicazione sul SC, a chi vorrŕ avere subito il progetto.
Ovviamente mi interessa molto verificare il corretto comportamento di fronte
a comandi variamente composti, quelli che la mia attuale fantasia
(inventandoli) non mi rammenta.

(inventandoli) non mi rammenta.
Non so se facciano al tuo caso, ma hai previsto l' uso di alias per tabelle
e campi, nonche' sottoquery?
E, visto che non se ne e' ancora parlato, il parser sql di M$ (sqlparse.dll)
potrebbe servire (magare come spunto)?
Ecco un esempio:
Dim parser As MSSQLParser.vbSQLParser
Dim sql As String
 
sql = "select tab1.*, tab2.altrocampo" & vbNewLine & _
        "from tabellaA tab1 inner join tabellaB tab2" & vbNewLine & _
        "on tab1.codice = tab2.codice" & vbNewLine & _
        "where tab1.descrizione like 'd%'" & vbNewLine & _
        "order by tab1.descrizione" & vbNewLine
 
Set parser = New vbSQLParser
Debug.Print parser.ParseSQLSyntax(sql, vbSqlServerSyntax)
OUTPUT:
\cf1 select\cf  \cf10 tab1\cf \cf5 .\cf \cf10 *\cf \cf5 ,\cf  \cf10 tab2\cf \cf5 .\cf \cf10 altrocampo\cf 
\par \cf1 from\cf  \cf10 tabellaA\cf  \cf10 tab1\cf  \cf1 inner\cf  \cf1 join\cf  \cf10 tabellaB\cf  \cf10 tab2\cf 
\par \cf1 on\cf  \cf10 tab1\cf \cf5 .\cf \cf10 codice\cf  \cf5 =\cf  \cf10 tab2\cf \cf5 .\cf \cf10 codice\cf 
\par \cf1 where\cf  \cf10 tab1\cf \cf5 .\cf \cf10 descrizione\cf  \cf5 like\cf  \cf6 'd%'\cf 
\par \cf1 order\cf  \cf1 by\cf  \cf10 tab1\cf \cf5 .\cf \cf10 descrizione\cf 
\par 
-- 
ciao, hal

 \par
Guardo questo output e, d'acchito, direi che è una grande stronzata (senza
offesa, Hal).
Mi pare che separi le parole usando spazi e caratteri sensibili.
Se guardi uno dei miei post in questo topic, capirai che ho bisogno di ben
altro, cioè scomporre le singole parti di ogni sezione, per poterle poi
liberamente ricomporre modificandole e/o aggiungendone altre.

 ha scritto nel messaggio
news:nXlT8.83688$Kt3.2...@twister2.libero.it...


Ho mandato il tutto al WM per l'eventuale pubblicazione.
Per ulteriori informaziuoni, si cerchi il topic
"[SQL] Parser SQL: Ho inviato al WM" del 30-06-02

poi non penso sia redistribuibile......
mmm, temo anch' io di no, fa parte di office :-(
-- 
ciao, hal