Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.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# 执行包含GO语句的批处理T-SQL脚本会引发异常_C#_.net_Sql Server - Fatal编程技术网

C# 执行包含GO语句的批处理T-SQL脚本会引发异常

C# 执行包含GO语句的批处理T-SQL脚本会引发异常,c#,.net,sql-server,C#,.net,Sql Server,我正试图用以下代码执行包含GO语句的SQl脚本 SqlConnection sqlConnection = new SqlConnection(RConnString); ServerConnection svrConnection = new ServerConnection(sqlConnection); Server server = new Server(svrConnection); returnvalue = server.ConnectionContext.ExecuteNonQu

我正试图用以下代码执行包含GO语句的SQl脚本

SqlConnection sqlConnection = new SqlConnection(RConnString);
ServerConnection svrConnection = new ServerConnection(sqlConnection);
Server server = new Server(svrConnection);
returnvalue = server.ConnectionContext.ExecuteNonQuery(strSpScript);
return Convert.ToString(returnvalue);
但它在直播中抛出了以下例外。这段代码在我的本地pc上运行良好

调用的目标已引发异常。在 System.RuntimeMethodHandle.InvokeMethod(对象目标,对象[]) 参数、签名sig、布尔构造函数)位于 System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(对象obj, 对象[]参数,对象[]参数)位于 System.Reflection.RuntimeMethodInfo.Invoke(对象obj,BindingFlags invokeAttr,绑定器绑定器,对象[]参数,CultureInfo区域性) 在System.RuntimeType.InvokeMember处(字符串名称,BindingFlags bindingFlags、绑定器绑定器、对象目标、对象[]提供的参数、, ParameterModifier[]修饰符,CultureInfo区域性,字符串[] 命名参数)在 Microsoft.SqlServer.Management.Common.ServerConnection.GetStatements(字符串 查询、ExecutionTypes executionType、Int32和statementsToReverse)位于 Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteOnQuery(字符串 sqlCommand,ExecutionTypes(executionType)位于 Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteOnQuery(字符串 sqlCommand)


GO
在T-SQL中不存在。它是SQLServerManagementStudio等工具的一项功能,而不是语言本身。相反,您应该找到任何
GO
,然后在那里拆分命令,分别执行它们。或者,重构您的T-SQL,使其不必使用
GO
——在许多情况下,
EXEC
可以在这里提供帮助。

使用如下代码:

using (var connection = new SqlConnection(RConnString)) 
{
    connection.Open();
    foreach (var batch in strSpScript.Split(new string[] {"\nGO", "\ngo"}, StringSplitOptions.RemoveEmptyEntries))
    {
         try
         {
             new SqlCommand(batch, connection).ExecuteNonQuery();
         }
         catch (Exception ex)
         {
             Console.WriteLine(ex.Message);
             throw;
         }
    }
}

只有在换行符上有“GO”(在一致的情况下)时,才能使用此命令-根据需要进行修改。

您的sql代码是什么?有一个sp的sql脚本,在sql代码中有GO语句。
GO
是一个客户端工具用来知道如何将脚本拆分为单独的批,并将这些批分别发送到sql Server的命令。您现在扮演的是客户机工具的角色,因此由您的代码执行相同的任务-查找
GO
s(小心引用和注释的文本)-并分别执行每个批。为了与其他客户机工具保持一致,当多行注释或多行字符串文字中存在
GO
时,您还需要避免拆分代码,因为我必须拆分SP并在循环中执行,为了更安全,我可以在新行中使用一些独特的代码,如“GO###”,并使用it@Damien_The_Unbeliever-是的,这不是好的通用代码,但是,如果您想要一些不需要编写语法分析器的快速而肮脏的东西,并且您可以控制输入,这将完成工作。@Sagar是的,这将起作用,但使用GO的好处是,您的脚本可以跨不同的客户端进行移植,例如,您可以在Management Studio中打开脚本进行调试。