Downloading SFTP files in SSDT.

I often need to download files from an SFTP site in SQL Server Data Tools (SSDT), the best way I’ve found of doing this is a script task that hooks into WinSCP.

WinSCP and it’s dlls can be downloaded here. Once installed, the dll should also be added to the GAC on the server that the package will be running on.

I then create the following variables in the package to store the required values and make the script dynamic.

  • sftpSourceHostKey
  • sftpSourceRemoteFolder
  • sftpSourceFilePatten
  • sftpSourceServerAddress
  • sftpSourceUserName
  • localWinScpExecutable
  • localDownloadFolder

These are then brought through into the script task and used as so, the WinSCP dll also needs to be added as a reference in the script so it can be accessed.

	
public void Main()
{
	// Load in SSIS variables
	string password = Dts.Variables["User::sftpSourceEncryptedPassword"].Value.ToString();
	string hostKey = Dts.Variables["User::sftpSourceHostKey"].Value.ToString();
	string remoteFolder = Dts.Variables["User::sftpSourceRemoteFolder"].Value.ToString();
	string searchPattern = Dts.Variables["User::sftpSourceFilePatten"].Value.ToString();
	Regex regexPattern = new Regex(searchPattern);
	string serverAddress = Dts.Variables["User::sftpSourceServerAddress"].Value.ToString();
	string userName = Dts.Variables["User::sftpSourceUserName"].Value.ToString();
	string winScpExecutable = Dts.Variables["User::localWinScpExecutable"].Value.ToString();
	string downloadFolder = Dts.Variables["User::localDownloadFolder"].Value.ToString();

	if (!downloadFolder.EndsWith("\\"))
	{
		downloadFolder += "\\";
	}

	// Create WinSCP session
	Session session = new Session();
	session.DisableVersionCheck = true;
	session.ExecutablePath = winScpExecutable;

	// Create WinSCP session options
	SessionOptions sessionOptions = new SessionOptions();
	sessionOptions.HostName = serverAddress;
	sessionOptions.UserName = userName;
	sessionOptions.Password = password;
	sessionOptions.SshHostKeyFingerprint = hostKey;
	sessionOptions.GiveUpSecurityAndAcceptAnySshHostKey = true;

	// Create WinSCP transfer options
	TransferOptions transferOptions = new TransferOptions();
	transferOptions.ResumeSupport.State = TransferResumeSupportState.On;
	transferOptions.PreserveTimestamp = false;
	transferOptions.FilePermissions = null;
	transferOptions.TransferMode = TransferMode.Automatic;

	// Open Session
	session.Open(sessionOptions);

	// Get list of all objects in target directory
	RemoteDirectoryInfo remoteDirectory = session.ListDirectory(remoteFolder);

	// Itterate through the files
	foreach (RemoteFileInfo file in remoteDirectory.Files)
	{
		if (file.IsDirectory == false && regexPattern.IsMatch(file.Name) == true)
		{
			// Download each file and remove from SFTP site when done
			TransferOperationResult result = session.GetFiles(remoteFolder + file.Name, downloadFolder + file.Name, true, transferOptions);
			// Will throw an error if not successful
			result.Check();
		}
	}

	session.Close();

	Dts.TaskResult = (int)ScriptResults.Success;
}
	

2 Comments

Jan · 18th October 2018 at 11:07 am

Hi!

Do you have an example for your Regex-searchPattern?

Best regards

Jan

    Shinigami · 22nd October 2018 at 10:28 am

    Hi Jan,

    If you wanted to match all .csv files you could use the following regex.

    .*\.csv$

    I normally use https://regexr.com/ to help me craft the regexes.

Leave a Reply

Your email address will not be published. Required fields are marked *