Pregunta

ejecuto scripts SQL para cambiar el esquema de base de datos. Se ve algo como esto:

using (var command = connection.CreateCommand())
{
    command.CommandText = script;
    command.ExecuteNonQuery();
}

Además, los comandos se ejecutan dentro de una transacción.

Las miradas scrip como esta:

Alter Table [TableName]
ADD [NewColumn] bigint NULL

Update [TableName]
SET [NewColumn] = (SELECT somevalue FROM anothertable)

Me aparece un error, porque NewColumn no existe. Parece que analizar y validar antes de que se ejecute.

Cuando ejecuto toda la materia en el Management Studio, puedo poner GO entre las declaraciones, entonces funciona. Cuando pongo GO en el guión, se queja ADO.NET (sintaxis incorrecta cerca de 'ir').

Me podría dividir la secuencia de comandos en secuencias de comandos separados y ejecutarlo en comandos separados, esto sería difícil de manejar. Podría dividirlo en cada GO, análisis de la secuencia de comandos a mí mismo. Sólo creo que debe haber una mejor solución y que yo no entendía algo. ¿Cómo se deben ejecutar guiones como este?


Mi aplicación si alguien está interesado, de acuerdo con la respuesta de John Saunders':

List<string> lines = new List<string>();
while (!textStreamReader.EndOfStream)
{
    string line = textStreamReader.ReadLine();
    if (line.Trim().ToLower() == "go" || textStreamReader.EndOfStream)
    {
        ExecuteCommand(
            string.Join(Environment.NewLine, lines.ToArray()));

        lines.Clear();
    }
    else
    {
        lines.Add(line);
    }
}
¿Fue útil?

Solución

Se tiene que ejecutar cada lote por separado. En particular, para ejecutar un script que puede contener varios lotes (palabras clave "Go"), usted tiene que dividir la secuencia de comandos en las palabras clave "Go".

No probado:

string script = File.ReadAllText("script.sql");
string[] batches = script.Split(new [] {"GO"+Environment.NewLine}, StringSplitOptions.None);
foreach (string batch in batches)
{
    // run ExecuteNonQuery on the batch
}

Otros consejos

No usar una de las bibliotecas ORM incontables para hacerlo? Bueno: -)

Para ser completamente seguro cuando se ejecuta las secuencias de comandos que hacen cambios estructurales utilizan SMO en lugar de SqlClient y asegúrese de que Marte no está activada a través de la cadena de conexión (SMO se quejan normalmente si se trata de todos modos). Busque ServerConnection clase y ExecuteNonQuery - DLL diferente, por supuesto: -)

El diff es que SMO DLL paSES el guión tal cual a SQL por lo que es genuino equivalente a correr en SSMS oa través de la línea cmd isql. Rebanar en los extremos GO-s hasta crecer en la exploración mucho más grande cada vez que se encuentra con otro problema técnico (como el GO puede estar en medio de un comentario de varias líneas, no puede haber varias instrucciones uso, un script puede estar bajando el DB que SQLClient conectado a - Uy :-). Acabo de matar a un tal cosa en el código base heredé (después de los guiones más complejos en conflicto con MARS MARS y es bueno para el código de producción, pero no para la materia de administración).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top