Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Create/Alter procedure必须是查询批处理中的第一条语句_C#_Sql Server - Fatal编程技术网

C# Create/Alter procedure必须是查询批处理中的第一条语句

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并用他的计算机创建了脚本,它工作正常,但当我用较新版本创建脚本时,我发现错误,这是我读

我正在尝试使用Visual Studio中的代码执行我的
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
出现在(多行)字符串文字或注释中,则客户端工具会忽略它,即使它是单独出现在一行中的唯一内容。祝你写这个正则表达式好运!很抱歉我的反馈太晚了,我失去了动力,你们太棒了,现在一切都好了,非常感谢。