How to avoid SSIS FTP task from failing when there are no files to download?

后端 未结 12 839
时光取名叫无心
时光取名叫无心 2020-12-01 06:42

I\'m using SQL Server 2005, and creating ftp tasks within SSIS.

Sometimes there will be files to ftp over, sometimes not. If there are no files, I don\'t want the

12条回答
  •  感动是毒
    2020-12-01 07:17

    This is another solution that is working for me, using built-in stuff and so without manually re-writing the FTP logic:

    1) Create a variable in your package called FTP_Error

    2) Click your FTP Task, then click "Event Handlers" tab

    3) Click within the page to create an event handler for "FTP Task/OnError" - this will fire whenever there is trouble with the FTP

    4) From the toolbox, drag in a Script Task item, and double-click to open that up

    5) In the first pop-up, ReadOnlyVariables - add System::ErrorCode, System::ErrorDescription

    6) In the first pop-up, ReadWriteVariables - add your User::FTP_Error variable

    7) Edit Script

    8) In the script set your FTP_Error variable to hold the ReadOnlyVariables we had above:

    Dts.Variables["FTP_Error"].Value = "ErrorCode:" + Dts.Variables["ErrorCode"].Value.ToString() + ", ErrorDescription=" + Dts.Variables["ErrorDescription"].Value.ToString();
    

    9) Save and close script

    10) Hit "OK" to script task

    11) Go back to "Control Flow" tab

    12) From the FTP task, OnError go to a new Script task, and edit that

    13) ReadOnlyVariables: User::FTP_Error from before

    14) Now, when there are no files found on the FTP, the error code is -1073573501 (you can find the error code reference list here: http://msdn.microsoft.com/en-us/library/ms345164.aspx)

    15) In your script, put in the logic to do what you want - if you find a "no files found" code, then maybe you say task successful. If not, then task failed. And your normal flow can handle this as you wish:

    if (Dts.Variables["FTP_Error"].Value.ToString().Contains("-1073573501"))
    {
      // file not found - not a problem
      Dts.TaskResult = (int)ScriptResults.Success;
    }
    else
    {
      // some other error - raise alarm!
      Dts.TaskResult = (int)ScriptResults.Failure;
    }
    

    And from there your Succeeded/Failed flow will do what you want to do with it.

提交回复
热议问题