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
スクリプトを自分で解析して、すべてに分割できました。もっと良い解決策があるべきだと思いますが、何かがわかりませんでした。このようなスクリプトはどのように実行する必要がありますか?
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);
}
}