Я выполняю сценарии SQL для изменения схемы базы данных. Это выглядит примерно так:
using (var command = connection.CreateCommand())
{
command.CommandText = script;
command.ExecuteNonQuery();
}
Кроме того, команды выполняются в транзакции.
Сценарий выглядит так:
Alter Table [TableName]
ADD [NewColumn] bigint NULL
Update [TableName]
SET [NewColumn] = (SELECT somevalue FROM anothertable)
Я получаю ошибку, потому что NewColumn
не существует. Кажется, он анализирует и проверяет его перед выполнением.
Когда я выполняю весь материал в Management Studio, я могу поместить GO
между утверждениями, тогда это работает. Когда я вставляю GO
в скрипт, ADO.NET жалуется (неправильный синтаксис рядом с 'GO').
Я мог бы разбить сценарий на отдельные сценарии и выполнить его в отдельных командах, с этим было бы трудно справиться. Я мог бы разделить его на каждый GO
, анализируя сценарий сам. Я просто думаю, что должно быть лучшее решение, и я чего-то не понял. Как должны выполняться подобные сценарии?
Моя реализация, если кому-то интересно, согласно ответу Джона Сондерса:
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);
}
}