C# Create/Alter procedure必须是查询批处理中的第一条语句
我正在尝试使用Visual Studio中的代码执行我的C# Create/Alter procedure必须是查询批处理中的第一条语句,c#,sql-server,C#,Sql Server,我正在尝试使用Visual Studio中的代码执行我的bin文件夹中的SQL脚本文件,在此之前,它在我使用SQL Server 2012时工作正常,我最近安装了SQL Server 2019,我使用SQL Server 2019创建了脚本,当应用程序尝试执行脚本时,我得到了错误消息 create/alter procedure必须是查询批处理中的第一条语句 我去找了一位朋友,他有SQL Server 2012并用他的计算机创建了脚本,它工作正常,但当我用较新版本创建脚本时,我发现错误,这是我读
bin
文件夹中的SQL脚本
文件,在此之前,它在我使用SQL Server 2012
时工作正常,我最近安装了SQL Server 2019
,我使用SQL Server 2019
创建了脚本,当应用程序尝试执行脚本时,我得到了错误消息
create/alter procedure必须是查询批处理中的第一条语句
我去找了一位朋友,他有SQL Server 2012
并用他的计算机创建了脚本,它工作正常,但当我用较新版本创建脚本时,我发现错误,这是我读取脚本文件的代码:
public static string ReadDBFile(string path)
{
string str;
StreamReader reader = new StreamReader(path);
str = reader.ReadToEnd();
str = str.Replace("GO", "");
reader.Close();
return str;
}
cmd.CommandText = ReadDBFile(Application.StartupPath + "/scriptfile.sql");
cmd.ExecuteNonQuery();
下面是我执行脚本文件的位置:
public static string ReadDBFile(string path)
{
string str;
StreamReader reader = new StreamReader(path);
str = reader.ReadToEnd();
str = str.Replace("GO", "");
reader.Close();
return str;
}
cmd.CommandText = ReadDBFile(Application.StartupPath + "/scriptfile.sql");
cmd.ExecuteNonQuery();
我确信这与SQL Server的升级有关,关于如何使其工作的任何线索?阅读数据库文件,用
\r\n
替换\r\n
,在字符串“\nGO\n”
上拆分*它,并逐个循环执行其中的语句
更像是:
public static string ExecBatchSql(string path)
{
string f = File.ReadAllText(path).Replace("\r\n", "\n");
string fs = f.Split(new[]{"\nGO\n"}, StringSplitOptions.RemoveEmptyEntries);
foreach(string cmd in fs){
SqlCommand c = new SqlCommand(cmd, connStr);
c.ExecuteNonQuery();
}
}
- 注意:检查您的文件,确保GO单独出现在一行上,没有前导或尾随空格。如果是这样的话,请将分割调整为更智能一点(可能必须使用正则表达式)
GO
;用空字符串替换“GO”
,只需。。。如果你的scriptfile.sql的内容有用的话,那么这个sql在2012年就不能正常工作了。您收到的错误不是2019年的新错误。只需删除str=str.Replace(“GO”),即可代码>行,它破坏了东西…是的,用空字符串替换GO
是有问题的-a)它们被用来告诉客户端工具在哪里将脚本拆分为批,b)字母GO
不一定只是作为批分隔符出现在“大脚本”中。也就是说,如果您有一个名为BINGO
的列,那么脚本中任何涉及该列的内容现在都在寻找一个名为BIN
的列。如果GO
出现在(多行)字符串文字或注释中,则客户端工具会忽略它,即使它是单独出现在一行中的唯一内容。祝你写这个正则表达式好运!很抱歉我的反馈太晚了,我失去了动力,你们太棒了,现在一切都好了,非常感谢。