SQL Server作业步骤重试尝试特定错误

时间:2018-11-27 23:36:32

标签: sql sql-server ssis sql-server-2014 ssis-2008

我有一个SQL作业(4步作业由SSIS包组成),该作业每天运行,并从各种来源(source1,source2,source3)提取数据,然后将数据加载到仓库。现在,由于步骤1中与source1的“通信链接失败”,我的工作失败了。

有什么办法可以仅基于此错误来设置重试尝试SQL作业。 例如,如果出现错误“主键冲突”或其他与数据有关的问题,则我们应直接收到作业失败的通知,但如果发生错误“通信链接失败”,则step1应该重试。

任何建议将不胜感激。

2 个答案:

答案 0 :(得分:0)

简短的回答:不,不能与SQL代理一起使用。

更长的答案:也许您可以建立som逻辑,以便程序包检查先前的错误是否是您要查找的特定错误,如果是,则再次执行。繁琐,但可能。

答案 1 :(得分:0)

您可以使用脚本任务为OnError事件创建事件处理程序,该脚本任务将检查此特定错误并在发生此错误时执行msdb.dbo.sp_start_job。由于我不确定您要获取的确切错误代码,因此仅使用@[System::ErrorDescription]选项检查StringComparison.CurrentCultureIgnoreCase系统变量中的特定文本,以使该匹配项不区分大小写。但是,我强烈建议您找到确切的错误代码,并使用@[System::ErrorCode]变量来进行验证。我还建议仅在一定时间内或在给定的时间范围内重试该作业,以免在此问题持续存在的情况下避免过多的故障。

  string errorMsg = Dts.Variables["System::ErrorDescription"].Value.ToString();

  if (errorMsg.IndexOf("Communication Link failure", 0, StringComparison.CurrentCultureIgnoreCase) >= 0)
  {
      string connString = @"YourConnectionString;";
      string startJobCmd = @"EXEC MSDB.DBO.SP_START_JOB N'NameOfJobToRetry;";

      using (SqlConnection conn = new SqlConnection(connString))
      {
          SqlCommand sql = new SqlCommand(startJobCmd, conn);
          conn.Open();

          sql.ExecuteNonQuery();
      }
  }