批量插入缺少最后一行?

esp*_*fee 3 sql sql-server coldfusion bulkinsert sql-server-2008

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

Mike    Johnson 1/29/1987   M
Run Code Online (Sandbox Code Playgroud)

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

Mike    Johnson 1/29/1987   M   test
Run Code Online (Sandbox Code Playgroud)

这是我的批量插入:

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

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

解:

对于任何人,如何使用ColdFusion,以下行将在文本文件中添加换行符。

exec xp_cmdshell 'echo. >> "#uncdir#\#cffile.ServerFile#"';
Run Code Online (Sandbox Code Playgroud)

关键是在Coldfusion变量周围加上双引号,否则代码将无法正常工作。

uncdir代码在这里:

<cfset uncdir = createObject("java","java.net.InetAddress").getLocalHost().getHostName()/>
Run Code Online (Sandbox Code Playgroud)

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

TT.*_*TT. 6

我在SQL Server 2008 R2上转载了您的问题。解决方案很简单,只需在文件中添加换行符,以使最后一行以换行符终止。

我创建了两个文件:

  1. 没有_换行符
  2. with_newline

然后运行以下脚本:

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;
Run Code Online (Sandbox Code Playgroud)

结果1:

first_name  | last_name_etc     | sex | test
--------------------------------------------
Tom         | Jackson 2/28/1986 | M   | test
Run Code Online (Sandbox Code Playgroud)

结果2:

first_name  | last_name_etc     | sex | test
--------------------------------------------
Tom         | Jackson 2/28/1986 | M   | test
Mike        | Johnson 1/29/1987 | M   | NULL
Run Code Online (Sandbox Code Playgroud)

解决方案应该简单到确保最后一行以结束\r\n。您可以更改生成文本文件的过程,也可以在批量插入之前手动进行操作。

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