1

我有一个包含超过 10k 行代码的 SQL 文件(filenameScript)。每个 SQL 块都以 GO 开头,以 GO 结尾。从 C# 执行文件时,我在 GO 语句附近遇到异常。但是当我在 SQL Server 中运行相同的文件时,它工作正常。

con.ConnectionString = sqlconn;
FileInfo file = new FileInfo(filenameScript);
string script = file.OpenText().ReadToEnd();
SqlCommand command = new SqlCommand(script, con);
con.Open();
command.ExecuteNonQuery();
Close();

我认为ExecuteNonQuerry无法处理这么多\n, \r,并且\t由于读取的文件存储在单行中,\n并且有很多\r. 有没有其他方法可以做到这一点?提前致谢。

4

1 回答 1

3

不,问题不在于文件的长度,也不在于\r和/或\n字符的存在。这是因为使用该方法执行 SQL 只能运行一个批处理,而具有GO语句的脚本会导致多个批处理。

一种可能性是拆分关键字上的文本GO并执行每个单独的部分:

con.ConnectionString = sqlconn;
var commands = File.ReadAllText(filenameScript).Split(new []{"GO"},StringSplitOption.RemoveEmptyEntries);
con.Open();
foreach(var batch in commands)
{
    SqlCommand command = new SqlCommand(batch, con);
    command.ExecuteNonQuery();
}
con.Close()

此外,您可以将其包装在 aTransaction中以确保所有批次都以原子方式执行。

此 SO 问题中还提供了一种替代方法:如何从 c# 执行大型 SQL 脚本(使用 GO 命令)

于 2013-04-18T08:41:57.917 回答