Попытки повторения шага задания SQL Server для конкретной ошибки - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть задание SQL (задание из 4 шагов, состоящее из пакетов служб SSIS), которое выполняется ежедневно и извлекает данные из различных источников (источник1, источник2, источник3), а затем загружает данные в хранилище.Теперь моя работа не выполняется из-за 'Ошибка связи с исходным кодом' на шаге 1.

Можно ли настроить задание на попытку повторной попытки SQL только на основе этой ошибки.Например, если я получаю сообщение об ошибке «нарушение первичного ключа» или какую-либо другую проблему, связанную с данными, мы должны напрямую получить уведомление о том, что задание не выполнено, но если у нас возникла ошибка «Ошибка связи», шаг 1 должен попытаться повторить попытку.

Любое предложение будет оценено.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Вы можете создать обработчик событий для события 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();
      }
  }
0 голосов
/ 28 ноября 2018

Краткий ответ: нет, не с агентом SQL.

Более длинный ответ: Возможно, вы можете создать логику сома, в которой пакет проверяет, была ли предыдущая ошибка той конкретной ошибкой, которую вы ищете, если затем выполните снова.Громоздко, но возможно.

...