Tengo un script de IronPython que ejecuta un conjunto de sentencias de SQL en una base de datos de SQL Server. las instrucciones son cadenas grandes que en realidad contienen varias instrucciones, separadas por la palabra clave "IR". Eso funciona cuando se ejecutan desde SQL Management Studio y algunas otras herramientas, pero no en ADO. Así que me separé las cadenas utilizando el módulo "re" 2.5, así:regex para analizar sentencias de SQL
splitter = re.compile(r'\bGO\b', re.IGNORECASE)
for script in splitter.split(scriptBlob):
if(script):
[... execute the query ...]
Esto rompe en el caso raro de que no es la palabra "ir" en un comentario o una cadena. ¿Cómo diablos iba a trabajar en eso? es decir, analiza correctamente esta cadena en dos guiones:
-- 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:
busqué más y encontré esta documentación de SQL: http://msdn.microsoft.com/en-us/library/ms188037(SQL.90).aspx
Como resultado, GO debe haber en su propia línea como algunas respuestas sugeridas. Sin embargo, puede ir seguido de un número "conteo" que realmente ejecutará el lote de declaración tantas veces (¿alguien realmente lo ha usado antes?) Y puede ser seguido por comentarios de una sola línea en la misma línea (pero no un multilínea, he probado esto) Así que la expresión regular magia sería algo como:.
"(?m)^\s*GO\s*\d*\s*$"
Salvo esto no tiene en cuenta:
- un posible comentario de una sola línea (
"--"
seguido de cualquier personaje excepto un salto de línea) al final. - toda la línea dentro de un comentario más grande de varias líneas.
No me preocupa capturar el argumento "contar" y usarlo. Ahora que tengo cierta documentación técnica, estoy tentadoramente cerca de escribir esto "a especificaciones" y nunca tener que preocuparme por ello nuevamente.
I upmodded respuestas de todo el mundo, gracias por la ayuda! Le concedí la respuesta a mcassano porque él fue el primero en sugerir que GO podría estar siempre en su propia línea, lo que me llevó a buscar la documentación para ese comando y, finalmente, a una solución mucho más fácil. –