SQL Try Catch仅针对特定严重性

时间:2013-09-24 12:28:48

标签: sql-server stored-procedures try-catch

您好我有一个很长的SQL脚本,它作为单个事务运行,可以从文件批量导入。

运行脚本时,我发现我收到一些信息性消息,一些警告,然后是一些立即停止运行脚本的错误 - 但是它不会回滚事务。

为了解决这个问题,我使用了一个try-catch块,如果有任何错误,它现在可以成功回滚事务;但是我的信息和警告也会触发catch阻止并在我的脚本完成后停止我的脚本。

有没有办法只针对关键错误跳转到catch,对于警告和信息消息我只想测试@@ error并将其插入字符串然后将这些全部输出给用户。

2 个答案:

答案 0 :(得分:0)

您使用的是RaiseError事件吗?

严重性级别0-9应用于信息级别消息。

了解更多信息

RaiseError

Database Engine Severity Levels

答案 1 :(得分:0)

试试这个,我希望它会给你解决方案

string cnnString = WebConfigurationManager.ConnectionStrings [“MyString”]。ConnectionString;     SqlConnection cnn = new SqlConnection(cnnString);     SqlTransaction事务;

cnn.Open();
transaction = cnn.BeginTransaction();

try
{

    // Command Objects for the transaction
    SqlCommand cmd1 = new SqlCommand("sproc1", cnn);
    SqlCommand cmd2 = new SqlCommand("sproc2", cnn);

    cmd1.CommandType = CommandType.StoredProcedure;
    cmd2.CommandType = CommandType.StoredProcedure;

    cmd1.Parameters.Add(new SqlParameter("@Param1", SqlDbType.NVarChar, 50));
    cmd1.Parameters["@Param1"].Value = paramValue1;

    cmd1.Parameters.Add(new SqlParameter("@Param2", SqlDbType.NVarChar, 50));
    cmd1.Parameters["@Param2"].Value = paramValue2;

    cmd2.Parameters.Add(new SqlParameter("@Param3", SqlDbType.NVarChar, 50));
    cmd2.Parameters["@Param3"].Value = paramValue3;

    cmd2.Parameters.Add(new SqlParameter("@Param4", SqlDbType.NVarChar, 50));
    cmd2.Parameters["@Param4"].Value = paramValue4;

cmd2.Parameters.Add(“@ out”,OleDbType.NVarCha);     myCommand.Parameters [“@ out”]。Direction = ParameterDirection.Output;

    cmd1.ExecuteNonQuery();
    cmd2.ExecuteNonQuery();

    transaction.Commit();
}

 catch (SqlException sqlExc)
      {
          foreach (SqlError error in sqlExc.Errors)
          {
             string errors = string.Format("{0}: ", error.Message);
              cmd2.Parameters["@out"].Value) = errors;

transaction.Rollback();

          }
      }

finally
{
    cnn.Close();
    cnn.Dispose();
}