【问题标题】:T-SQL FTP using xp_cmdshell使用 xp_cmdshell 的 T-SQL FTP
【发布时间】:2012-06-17 05:22:28
【问题描述】:

我正在使用以下代码 sn-p 将简单文本文件从 Windows Server 2003 / SQL Server 2005 数据库 FTP 到 BULL FTP 站点,并且在 BULL 端遇到了一些损坏。

select @cmd = 'ftp -s:' + @workdir + @workfilename
exec master..xp_cmdshell @cmd, NO_OUTPUT

文本文件包含 SEP490067,但是当它在 BULL 上打开时,它看起来像这样 ..S.E.P.4.9.0.0.6.7..

在使用 SSIS FTP 组件发送文件并将 IsTransferAscii 开关切换为 True 时,我曾看到过类似的情况可以解决此问题。我的问题是您是否必须在上面的 FTP 命令中设置另一个命令行开关才能使用 ASCII 而不是二进制发送文件?

这是完整的 TSQL

USE [JCB_QSmart]
GO
/****** Object:  StoredProcedure [dbo].[FTP_PutFile]    Script Date: 06/14/2012 08:56:55 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[FTP_PutFile]
@FTPServer  varchar(128) ,
@FTPUser    varchar(128) ,
@FTPPWD     varchar(128) ,
@FTPPath    varchar(128) ,
@FTPFileName    varchar(128) ,
@SourcePath varchar(128) ,
@SourceFile varchar(128) ,
@workdir    varchar(128),
    @ShowOutput as bit = 0
as

declare @cmd varchar(1000)
declare @workfilename varchar(128)

    select @workfilename = 'ftpcmd.txt'

    -- deal with special characters for echo commands
    select @FTPServer = replace(replace(replace(@FTPServer, '|', '^|'),'<','^<'),'>','^>')
    select @FTPUser = replace(replace(replace(@FTPUser, '|', '^|'),'<','^<'),'>','^>')
    select @FTPPWD = replace(replace(replace(@FTPPWD, '|', '^|'),'<','^<'),'>','^>')
    select @FTPPath = replace(replace(replace(@FTPPath, '|', '^|'),'<','^<'),'>','^>')

    select  @cmd = 'echo '                  + 'open ' + @FTPServer
            + ' > ' + @workdir + @workfilename
    exec master..xp_cmdshell @cmd
    select  @cmd = 'echo '                  + @FTPUser
            + '>> ' + @workdir + @workfilename
    exec master..xp_cmdshell @cmd
    select  @cmd = 'echo '                  + @FTPPWD
            + '>> ' + @workdir + @workfilename
    exec master..xp_cmdshell @cmd
    select  @cmd = 'echo '                  + 'put ' + @SourcePath + @SourceFile + ' ' + @FTPPath + @FTPFileName
            + ' >> ' + @workdir + @workfilename
    exec master..xp_cmdshell @cmd
    select  @cmd = 'echo '                  + 'quit'
            + ' >> ' + @workdir + @workfilename
    exec master..xp_cmdshell @cmd

    select @cmd = 'ftp -s:' + @workdir + @workfilename

    create table #a (id int identity(1,1), s varchar(1000))
    insert #a
    exec master..xp_cmdshell @cmd, NO_OUTPUT

    select id, ouputtmp = s from #a

【问题讨论】:

  • 请不要这样做。使用 SSIS 什么的。
  • 发送前业务逻辑的复杂性不适合 SSIS,否则我会使用它...有时 SSIS 不是完成任务的正确平台。
  • 您可以在 SSIS 中编写代码。你提议的是让 SQL Server 做一些它不应该做的事情。 XP_CMDSHELL 应该是最后的手段 - 恕我直言

标签: sql tsql sql-server-2005 ftp xp-cmdshell


【解决方案1】:

由于您使用-s 开关进行ftp,因此您应该在连接到FTP 服务器后立即将ascii-命令放入您的工作文件中。

编辑:

因此,在您的 StoredProc 中,您必须在包含 'put ' 命令的行之前添加以下行:

select  @cmd = 'echo ' + 'ascii > ' + @workdir + @workfilename
exec master..xp_cmdshell @cmd

代码应该包含额外的>

select  @cmd = 'echo ' + 'ascii >> ' + @workdir + @workfilename
exec master..xp_cmdshell @cmd

【讨论】:

  • 你能给我举个例子吗?
【解决方案2】:

不要在参数 X @FTPServer 上使用 ftp://,只需输入 ip 地址或域。喜欢,

echo open 10.16.22.21 > 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 2016-04-06
    • 1970-01-01
    相关资源
    最近更新 更多