SSIS - когда соединение не работает - PullRequest
2 голосов
/ 27 июля 2010

У меня есть простой пакет служб SSIS, который я редактирую в VS2008. Что в основном делает, так это запускает один и тот же SQL StoredProc, находясь на разных серверах SQL, и объединяя их выходные данные в плоский файл. Проще говоря, четыре источника данных OLE DB отправляются в «Объединение всех» для вывода.

Если один из серверов не работает, как я могу сделать так, чтобы пакет пропускал проверку для этого источника и, следовательно, обработку, в то же время агрегируя, что возможно?

Я быстро прочитал, что ConnectionStrings находится в файле, использует сценарии и т. Д., Надеюсь, я смогу избежать этого.

Заранее благодарю за любую помощь.

1 Ответ

2 голосов
/ 28 июля 2010

Вот несколько возможных решений:

  1. Если сама база данных недоступна, но сервер доступен, вы можете изменить подключение по умолчанию на то, что всегда доступно, например системную базу данных (master, msdb, tempdb, model). Я использую эту технику при запросе баз данных, отправленных журналом, поскольку они периодически находятся в состоянии «Восстановление» каждый час дня.

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

  3. У вас могут быть отдельные потоки данных, и каждый из них может добавлять данные в файл вместо перезаписи содержимого. Затем вы можете установить DelayValidation = True и MaximumErrorCount <> 0. Это позволит каждому потоку данных успешно выполняться, избегая возникновения ошибки сбоя пакета.

  4. Используйте задачу скрипта для выполнения запросов. Это даст вам максимальный контроль над обработкой исключений с источником данных. Извините за странно сформированный пример кода ниже, но блок кода не форматирует это так хорошо, как обычно для меня, поэтому мои попытки заставить его работать добавили много мертвого пространства. Цель примера кода - показать вам, как запрашивать базу данных и обнаруживать ошибки. Вы всегда можете заставить его игнорировать ошибки и завершить успешно.

       // Try-Catch block
        try
    
        {
    
            bool fireAgain = true;
    
            string SQLCommandText = "EXEC dbo.usp_some_stored_procedure_or_select_statement;";
    
        SqlConnection SQLConnection = new SqlConnection("Data Source=SomeServerName;Initial Catalog=master;Integrated Security=SSPI;Application Name=SSIS-My Package Name;Connect Timeout=600");
    
        SqlCommand SQLCommand = new SqlCommand(SQLCommandText, SQLConnection);
    
        SQLCommand.CommandTimeout = 60 * 60;
    
        SqlDataAdapter SQLDataAdapter = new SqlDataAdapter(SQLCommand);
    
        DataTable dt = new DataTable();
    
        SQLDataAdapter.Fill(dt);
    
        SQLConnection.Close();
    
        RowsRemaining = dt.Rows.Count;
    
        Dts.Events.FireInformation(0, "DataTable Rows", RowsRemaining.ToString(), "", 0, ref fireAgain);
    
    }
    
    catch (SqlException e)
    
    {
    
        Dts.Events.FireError(0, "SqlException", e.Message, "", 0);
    
        Error = 1;
    
    }
    
    
    // Return results.
    
    if (Error == 0)
    
    {
    
        Dts.TaskResult = (int)ScriptResults.Success;
    
    }
    
    else
    
    {
    
        Dts.TaskResult = (int)ScriptResults.Failure;
    
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...