2

以下のコードスニペットを使用して、Windows Server 2003 / SQL Server2005データベースからBULLFTPサイトに単純なテキストファイルをFTPで転送していますが、BULL側で破損が発生しています。

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

テキストファイルにはSEP490067が含まれていますが、これをBULLで開くと、..SEP4.9.0.0.6.7のように表示されます。

SSIS FTPコンポーネントを使用してファイルを送信し、IsTransferAsciiスイッチをTrueに切り替えると、問題が修正される前に、このようなものを見たことがあります。私が持っている質問は、バイナリではなくASCIIを使用してファイルを送信するために、上記のFTPコマンドで別のコマンドラインスイッチを設定する必要があるかどうかです。

これが完全な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
4

2 に答える 2

4

-sftp のスイッチを使用するasciiため、FTP サーバーに接続した直後に -command をワークファイルに追加する必要があります。

編集:

'put 'したがって、StoredProc では、コマンドを含む行の直前に次の行を追加する必要があります。

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

コードには追加の > を含める必要があります

select  @cmd = 'echo ' + 'ascii >> ' + @workdir + @workfilename
exec master..xp_cmdshell @cmd
于 2012-06-14T07:53:07.297 に答える
0

パラメーター X @FTPServer で ftp:// を使用しないでください。IP アドレスまたはドメインを入力するだけです。お気に入り、

echo open 10.16.22.21 > 
于 2021-07-29T08:13:48.000 に答える