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

时间:2014-06-25 06:36:10

标签: c# .net sql-server

我正在尝试使用以下代码执行包含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);

但它会在现场直播后抛出。这段代码在我的本地电脑上工作正常

  

调用目标抛出了异常。在   System.RuntimeMethodHandle.InvokeMethod(Object target,Object []   参数,签名sig,布尔构造函数)at   System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj,   Object []参数,Object []参数)at   System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags   invokeAttr,Binder binder,Object []参数,CultureInfo文化)   在System.RuntimeType.InvokeMember(String name,BindingFlags   bindingFlags,Binder binder,Object target,Object [] providedArgs,   ParameterModifier []修饰符,CultureInfo文化,String []   namedParams)at   Microsoft.SqlServer.Management.Common.ServerConnection.GetStatements(字符串   query,ExecutionTypes executionType,Int32& statementsToReverse)at   Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(字符串   sqlCommand,ExecutionTypes executionType)at   Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(字符串   的SqlCommand)

2 个答案:

答案 0 :(得分:6)

T-SQL中的

GO 不存在。它是SQL Server Management Studio等工具的一个特性,而不是语言本身。相反,您应找到任何GO将命令拆分,然后单独执行。或者,重构您的T-SQL,使其无法GO工作 - 在很多情况下,EXEC可以在此处提供帮助。

答案 1 :(得分:2)

使用以下代码:

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”(并且在一致的情况下)时才会这样做 - 根据需要进行修改。