我有一个SQL作业(4步作业由SSIS包组成),该作业每天运行,并从各种来源(source1,source2,source3)提取数据,然后将数据加载到仓库。现在,由于步骤1中与source1的“通信链接失败”,我的工作失败了。
有什么办法可以仅基于此错误来设置重试尝试SQL作业。 例如,如果出现错误“主键冲突”或其他与数据有关的问题,则我们应直接收到作业失败的通知,但如果发生错误“通信链接失败”,则step1应该重试。
任何建议将不胜感激。
答案 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();
}
}