执行包含GO语句的批处理T-SQL脚本会抛出异常

本文关键字:T-SQL 脚本 抛出异常 批处理 包含 GO 语句 执行 | 更新日期: 2023-09-27 18:10:07

我正在尝试执行包含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);

但是它会在live上抛出以下异常。这段代码在我的本地pc上运行良好

异常被调用的目标抛出。在System.RuntimeMethodHandle。调用方法(对象目标,对象[]参数,签名签名,布尔构造函数)System.Reflection.RuntimeMethodInfo。UnsafeInvokeInternal(对象obj,对象[]参数,对象[]参数)System.Reflection.RuntimeMethodInfo。调用对象obj, BindingFlags绑定器,绑定器,对象[]参数,文化信息,文化)在System.RuntimeType。InvokeMember(字符串名称,绑定标志bindingFlags, Binder, Binder, Object target, Object[]ParameterModifier[] modifiers, CultureInfo文化,字符串[]namedParams)Microsoft.SqlServer.Management.Common.ServerConnection.GetStatements(字符串查询,ExecutionTypes executionType, Int32&statementsToReverse)Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(字符串sqlCommand, ExecutionTypes executionType) atMicrosoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(字符串sqlCommand)

执行包含GO语句的批处理T-SQL脚本会抛出异常

GO 在T-SQL中不存在。它是SQL Server Management Studio等工具的一个特性,而不是语言本身。相反,您应该找到任何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'时起作用(并且在一致的情况下)-根据需要修改