是否有可能仅通过使用T-SQL命令而不使用SSIS来使SQL Server登录到SFTP并上传文件?

问题描述 投票:-2回答:1

我有一个SSIS程序包,该程序包登录到客户端的SFTP站点并使用发送到WinSCP的命令上载文件。

此程序包经常失败,很难使用。 Visual Studio崩溃如此频繁,以至于我的团队拒绝再使用它。我们正在将所有自动化任务迁移到存储过程和SQL Agent Jobs,因为它们的工作性能比SSIS好得多。

但是,对于自动化在SQL Server上生成的报告文件的FTP上载,我们没有好的解决方案。

我一直使用PSFTP和从VB脚本调用的批处理文件来执行此操作。该脚本检查特定的文件夹以查看是否存在文件,如果存在则上载该文件。这行得通,但是很麻烦,我必须安排这些脚本每15分钟在文件夹中查找一个文件,而不是仅仅从SQL Server上的存储过程中调用“上传”命令。如果有人在该文件夹中重命名文件或在其中放置两个文件,则事情可能会发生严重错误。

我可以使用BCP轻松地将.CSV文件作为存储过程的一部分创建到特定文件夹中,例如:

--Create Client Update .CSV File if there are any rows in the CLIENT_UPDATE table
IF EXISTS(SELECT 1 FROM CLIENT_UPDATE)
BEGIN
DECLARE @ColumnHeader VARCHAR(8000)
    SET @FileName = @DataPath + '\Output File.csv'
 SELECT @ColumnHeader = COALESCE(@ColumnHeader+',' ,'')+''''+column_name+'''' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='CLIENT_UPDATE'
    SET @BCPCommand = 'bcp "SELECT '+ @ColumnHeader +' UNION ALL SELECT * FROM CLIENT_UPDATE" queryout "' + @FileName + '" -c -t , -r \n  -S . -T'
   EXEC master..xp_cmdshell @bcpCommand
END

我希望该存储过程的下一步是“将.CSV文件上传到客户端SFTP站点”。我将如何完成?

sql-server automation sftp windows-server
1个回答
0
投票

成功!

我在名为sp_UploadFileToSFTP的数据库上创建了一个存储过程,该数据库使用PSFTP.EXE发送文件。

-- ================================================================================================================================
-- Author:      John Eddowes
-- Create date: 2019-10-29
-- Description: Upload File to SFTP
--              - Creates "SFTPUploadScript.bat" and "SFTPUploadScript.txt" scripting files to control PSFTP.EXE, then executes the batch file
--              - Requires a local @ScriptFolder on the SQL Server to create files inside, and which contains PSFTP.EXE
--              - "SFTPUploadScript.bat" needs to be run once manually from the SQL Server desktop to capture the keypair of the SFTP site
--                After this, the script will work automatically
-- ================================================================================================================================
CREATE PROCEDURE sp_UploadFileToSFTP 

    @FilePathToUpload varchar(1000),
    @SFTPSiteAddress varchar(1000),
    @SFTPLogin varchar(1000),
    @SFTPPassword varchar(1000),
    @SFTPRemoteFolder varchar(1000)

AS
BEGIN
SET NOCOUNT ON;

--Declare Variables
 DECLARE @ScriptFolder varchar(1000)
     SET @ScriptFolder = 'C:\SFTPBatchFiles\'
 DECLARE @CommandString AS varchar(8000)

--Delete Existing files if they exist
     SET @CommandString = 'del "'+ @ScriptFolder + 'SFTPUploadScript.txt"'
    EXEC master..xp_cmdshell @CommandString
     SET @CommandString = 'del "'+ @ScriptFolder + 'SFTPUploadScript.bat"'
    EXEC master..xp_cmdshell @CommandString

--Create Batch fle with login credentials
     SET @CommandString = 'echo "'+ @ScriptFolder +'psftp.exe" ' + @SFTPSiteAddress + ' -l ' + @SFTPLogin + ' -pw ' + @SFTPPassword + ' -b "' + @ScriptFolder + 'SFTPUploadScript.txt" > "' + @ScriptFolder + 'SFTPUploadScript.bat"'
    EXEC master..xp_cmdshell @CommandString

--Create SFTP upload script file
     SET @CommandString = 'echo cd "' + @SFTPRemoteFolder + '" > "' + @ScriptFolder + 'SFTPUploadScript.txt"'
    EXEC master..xp_cmdshell @CommandString
     SET @CommandString = 'echo put "' + @FilePathToUpload + '" >> "' + @ScriptFolder + 'SFTPUploadScript.txt"'
    EXEC master..xp_cmdshell @CommandString

--Run the Batch File
     SET @CommandString = @ScriptFolder + 'SFTPUploadScript.bat'
    EXEC master..xp_cmdshell @CommandString

END
GO

然后我可以从另一个存储的过程中调用它,就像这样:

sp_UploadFileToSFTP 'C:\FileToUpload\Test.txt','sftp.mysite.com','[email protected]','Password1234','UploadFolder/In here/'

一切正常,运行大约需要四分之一秒,这是一个非常简洁且稳定的解决方案。

与我之前使用SQL Server将文件拖放到文件夹中,然后每隔15分钟使用我的Visual Basic SFTP上传脚本检查该文件夹中是否有新文件的操作相比,它就更好了:)

如果您想亲自尝试,只需在SQL Server的C:\驱动器上找到一个名为“ SFTPBatchFiles”的文件夹,然后在其中放置PSFTP.EXE,它是PuTTY的一部分。

您还将需要一个非常了解服务器的管理员,该管理员将允许您使用xp_cmdshell运行PSFTP和您自己的批处理文件,他们可能需要在防火墙中打开一条路由,以便您可以直接从远程服务器连接到远程站点。 SQL Server。

最后,您还需要能够将桌面远程访问SQL Server,因为您需要运行一次手动创建的批处理文件,并在PSFTP要求您接受新的密钥对时按“ Y”。在那之后,一切顺利。

无SSIS,无WINSCP,无Visual Studio,无数小时的崩溃和调试!

现在唯一的问题是,如果由于某种原因FTP传输失败,则存储过程仍然报告成功,我不会将PSFTP错误消息重新带回SQL Server。

我的下一个任务是捕获从xp_cmdshell生成的状态和错误消息,并向用户提供一些详细的反馈信息,如果该过程失败,则会产生错误。

© www.soinside.com 2019 - 2024. All rights reserved.