Попытки повторения шага задания 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();
      }
  }
Другие вопросы по тегам