Ho uno script IronPython che esegue una serie di istruzioni SQL su un database SQL Server. le istruzioni sono stringhe di grandi dimensioni che contengono effettivamente più istruzioni, separate dalla parola chiave "GO". Funziona quando vengono eseguiti da SQL Management Studio e alcuni altri strumenti, ma non in ADO. Così ho diviso le stringhe utilizzando il modulo da 2,5 "re" in questo modo:regex per l'analisi delle istruzioni SQL
splitter = re.compile(r'\bGO\b', re.IGNORECASE)
for script in splitter.split(scriptBlob):
if(script):
[... execute the query ...]
Questo rompe nel raro caso in cui ci sia la parola "andare" in un commento o una stringa. Come diamine avrei lavorato su quello? cioè analizza correttamente questa stringa in due script:
-- this is a great database script! go team go!
INSERT INTO myTable(stringColumn) VALUES ('go away!')
/*
here are some comments that go with this script.
*/
GO
INSERT INTO myTable(stringColumn) VALUES ('this is the next script')
EDIT:
ho cercato di più e trovato questa documentazione di SQL: http://msdn.microsoft.com/en-us/library/ms188037(SQL.90).aspx
Come si è visto, GO deve essere sulla propria linea come suggerito da alcune risposte. Comunque può essere seguito da un numero intero di "conteggio" che in realtà eseguirà il batch di istruzioni più volte (qualcuno lo ha effettivamente usato prima ??) e può essere seguito da commenti a riga singola sulla stessa riga (ma non a multi-linea, ho provato questo) Così l'espressione regolare magia sarebbe simile:.
"(?m)^\s*GO\s*\d*\s*$"
solo che questa non tiene conto di:
- una possibile singola riga di commento (
"--"
seguito da qualsiasi carattere tranne una interruzione di riga) alla fine. - l'intera riga all'interno di un commento multi-linea più grande.
Non sono interessato a catturare l'argomento "contare" e utilizzarlo. Ora che ho un po 'di documentazione tecnica, sono allettantemente vicino a scrivere questo "su specifiche" e non dovrò mai più preoccuparmi di questo.
ho upmodded risposte di tutti, grazie per l'aiuto! Ho concesso la risposta a mcassano perché è stato il primo a suggerire che GO potesse essere sempre sulla propria linea, il che mi ha portato a cercare la documentazione per quel comando e alla fine ha portato a una soluzione molto più semplice. –