2012-06-14 80 views
2

我正在使用下面的代码片段将FTP简单文本文件从Windows Server 2003/SQL Server 2005数据库迁移到BULL FTP站点,并且在BULL端获得一些损坏。使用xp_cmdshell的T-SQL FTP

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

文本文件包含SEP490067但是,当这打开了牛市出现这样..SEP4.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 
+1

请不要这样做。使用SSIS或其他东西。 – SQLMason

+1

发送之前业务逻辑的复杂性不适合SSIS,否则我会使用它...有时SSIS不是适合任务的平台。 –

+0

您可以在SSIS中编写代码。你提出的是让SQL服务器做一些它不应该做的事情。 XP_CMDSHELL应该是最后的手段 - 恕我直言 – SQLMason

回答

4

由于您使用-s开关FTP,你应该把ascii -command在你的工作文件,你连接到FTP服务器之后。

编辑:

因此,在您StoredProc你有一个包含'put '命令行之前有权添加以下行:

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

代码应包括额外>

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

你能给我一个如何做到这一点的例子吗? –

+0

感谢您的帮助 –

+0

并感谢您的编辑:) –