当缺少 {CR} 且 {LF} 出现在固定长度文件的末尾时,BCP 不工作

BCP not working when {CR} is missing & {LF} is present at the end of a fixed length file

SET @query='bcp Staging.DBO.MSP_Tin_Reference_Response_FileImport in '+@TinResponseFilePath+@TinResponseFileName+' -T -c ' 
EXEC MASTER..xp_cmdshell @query --,1

并抛出以下错误:

NULL
Starting copy...
SQLState = S1000, NativeError = 0
Error = [Microsoft][SQL Server Native Client 10.0]Unexpected EOF encountered in BCP data-file
NULL
0 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total     : 1     
NULL

感谢您能给我的任何帮助。

默认情况下,-c 选项要求每行在 {CR}{LF} 中终止。但是,您可以使用 -r 选项告诉 BCP 使用不同的行终止符。

我建议您尝试使用选项 -c -r \n -t \t 进行导入。这指定导入将对所有字段使用字符数据类型,但将 {LF} 指定为行终止符,将 TAB 指定为字段分隔符。

另一件事是,最好始终将文件名放在双引号 ("<file name>") 之间,否则如果文件名中有空格,BCP 命令将失败。

因此您的命令将如下所示:

SET @query='bcp Staging.DBO.MSP_Tin_Reference_Response_FileImport in "'+@TinResponseFilePath+@TinResponseFileName+'" -T -c -r \n -t \t' 
EXEC MASTER..xp_cmdshell @query --,1

更新:看来您仍然遇到问题;现在 BCP 要求 字段 XXX 的文件存储类型。

您可以通过以下方式解决此问题:

  1. 首先为您的 table 创建格式文件。你只需要这样做一次。
  2. 在导入命令中指定格式文件。

第一步(以C:\Temp\fi.fmt为例):

SET @query='BCP Staging.DBO.MSP_Tin_Reference_Response_FileImport format nul -f "C:\Temp\fi.fmt"';
EXEC MASTER..xp_cmdshell @query;

第 2 步。运行 使用 -f 开关导入:

SET @query='bcp Staging.DBO.MSP_Tin_Reference_Response_FileImport in "'+@TinResponseFilePath+@TinResponseFileName+'" -f "C:\Temp\fi.fmt" -T -r \n -t \t' 
EXEC MASTER..xp_cmdshell @query