Попытки повторения шага задания SQL Server для конкретной ошибки
У меня есть задание SQL (задание из 4 шагов, состоящее из пакетов служб SSIS), которое выполняется ежедневно и извлекает данные из различных источников (source1, source2, source3), а затем загружает данные в хранилище. Теперь моя работа не выполняется из-за "сбоя линии связи" с источником 1 на шаге 1.
Можно ли как-то настроить задание повторной попытки SQL на основе только этой ошибки? Например, если я получаю сообщение об ошибке "нарушение первичного ключа" или какую-либо другую проблему, связанную с данными, мы должны напрямую получить уведомление о том, что задание не выполнено, но если у нас возникла ошибка "Ошибка связи", шаг 1 должен выполнить попытку повтора.
Любое предложение будет оценено.
2 ответа
Краткий ответ: нет, не с агентом SQL.
Более длинный ответ: Может быть, вы можете создать логику сома, в которой пакет проверяет, была ли предыдущая ошибка той конкретной ошибкой, которую вы ищете, если затем выполните снова. Громоздко, но возможно.
Вы можете создать обработчик событий для 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();
}
}