【问题标题】:SQL Server job step retry attempts for specific error针对特定错误的 SQL Server 作业步骤重试尝试
【发布时间】:2019-04-29 19:07:57
【问题描述】:

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

有什么方法可以仅根据上述错误设置重试 SQL 作业。 例如,如果我收到错误“主键违规”或其他一些与数据相关的问题,那么我们应该直接收到作业失败的通知,但如果我们遇到错误“通信链接失败”,那么 step1 应该重试。

任何建议都将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    简短回答:不,不是使用 SQL 代理。

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

    【讨论】:

      【解决方案2】:

      您可以使用脚本任务为OnError 事件创建事件处理程序,该任务将检查此特定错误并在发生此错误时执行msdb.dbo.sp_start_job。由于我不确定您得到的确切错误代码,因此仅使用StringComparison.CurrentCultureIgnoreCase 选项检查@[System::ErrorDescription] 系统变量中的特定文本,以使此匹配不区分大小写。但是,我强烈建议您找到确切的错误代码并使用@[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();
            }
        }
      

      【讨论】:

      • 谢谢!!我会试试这个,让你们都知道结果。再次感谢您的帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      相关资源
      最近更新 更多