2012-06-14 4 views
2

Windows Server 2003/SQL Server 2005 데이터베이스에서 BULL FTP 사이트로 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를 사용하여 파일을 보내야한다는 것입니다. 당신은 당신이 놓아야 FTP의 -s 스위치를 사용하기 때문에

여기

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이 최후의 수단이되어야합니다 - IMHO – SQLMason

답변

4

완전 TSQL 인 ascii - 명령 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

그리고 고맙습니다. :) –