C# 执行包含GO语句的批处理T-SQL脚本会引发异常
我正试图用以下代码执行包含GO语句的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
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中打开脚本进行调试。