BULK INSERT缺少最后一行?

时间:2016-11-21 19:36:52

标签: sql sql-server sql-server-2008 coldfusion bulkinsert

我将BULK INSERT用于我的文本文件。一切正常,但我发现了一件事,如果我给最后一行的最后一列一个值,它就会导入。如果最后一行中最后一列的值为空,则会丢弃该行,尽管目标列允许空值!文本文件使用制表符分隔符,这是最后一行数据的示例:

Mike    Johnson 1/29/1987   M

如果我在最后一列中有任何值,则会插入字段行,例如:

Mike    Johnson 1/29/1987   M   test

这是我的BULK Insert:

BULK INSERT ##TEMP_TEXT
FROM '#uncdir#\#cffile.ServerFile#'
WITH (
    FIELDTERMINATOR = '\t', 
    ROWTERMINATOR = '\n'
)

我尝试使用\r代替\n,但这并没有解决问题。我也研究了一些网站,但找不到任何解决方案。我想知道这是可以在SQL中修复的东西。如果有人知道如何解决这个问题,请告诉我。

解决方案:

对于任何人来说,使用ColdFusion的方法是在文本文件中添加换行符的行。

exec xp_cmdshell 'echo. >> "#uncdir#\#cffile.ServerFile#"';

关键是在coldfusion变量周围放置双引号,否则代码不起作用。

uncdir代码在这里:

<cfset uncdir = createObject("java","java.net.InetAddress").getLocalHost().getHostName()/>

cffile.ServerFile您可以从表单中获取。我使用JQuery提交文本文件。我希望这有帮助。谢谢。

1 个答案:

答案 0 :(得分:4)

我在SQL Server 2008 R2上重现了您的问题。解决方案就像在文件中添加换行符一样简单,以便最后一行以换行符结束。

我创建了两个文件:

  1. without_newline
  2. with_newline
  3. 然后运行以下脚本:

    CREATE TABLE #t(first_name VARCHAR(128),last_name_etc VARCHAR(128),sex CHAR(1),test VARCHAR(128));
    
    BULK INSERT #t
    FROM 'C:\temp\without_newline.txt'
    WITH (
        FIELDTERMINATOR='\t',
        ROWTERMINATOR='\n'
    );
    
    SELECT * FROM #t;
    
    TRUNCATE TABLE #t;
    
    BULK INSERT #t
    FROM 'C:\temp\with_newline.txt'
    WITH (
        FIELDTERMINATOR='\t',
        ROWTERMINATOR='\n'
    );
    
    SELECT * FROM #t;
    
    DROP TABLE #t;
    

    结果1:

    first_name  | last_name_etc     | sex | test
    --------------------------------------------
    Tom         | Jackson 2/28/1986 | M   | test
    

    结果2:

    first_name  | last_name_etc     | sex | test
    --------------------------------------------
    Tom         | Jackson 2/28/1986 | M   | test
    Mike        | Johnson 1/29/1987 | M   | NULL
    

    解决方案应该像确保最后一行以\r\n终止一样简单。您可以更改生成文本文件的过程,也可以在批量插入之前手动执行该过程。

    手动执行此操作的一种方法是在批量插入之前运行EXEC xp_cmdshell 'echo. >> C:\temp\without_newline.txt'