BULK INSERT 缺少最后一行?
BULK INSERT missing last row?
我对我的文本文件使用 BULK INSERT。一切正常,但我发现了一件事,如果我给最后一行的最后一列一个值,它将导入。如果最后一行中最后一列的值为空,它会丢弃该行,尽管目标列允许空值!文本文件使用制表符分隔符,这里是最后一行数据的示例:
Mike Johnson 1/29/1987 M
如果我在最后一列中有任何值,字段行将被插入,示例如下:
Mike Johnson 1/29/1987 M test
这是我的批量插入:
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 提交文本文件。我希望这有帮助。谢谢。
我在 SQL Server 2008 R2 上重现了您的问题。解决方案就像在文件中添加一个换行符一样简单,以便最后一行以换行符结尾。
我创建了两个文件:
然后运行下面的脚本:
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'
。
我对我的文本文件使用 BULK INSERT。一切正常,但我发现了一件事,如果我给最后一行的最后一列一个值,它将导入。如果最后一行中最后一列的值为空,它会丢弃该行,尽管目标列允许空值!文本文件使用制表符分隔符,这里是最后一行数据的示例:
Mike Johnson 1/29/1987 M
如果我在最后一列中有任何值,字段行将被插入,示例如下:
Mike Johnson 1/29/1987 M test
这是我的批量插入:
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 提交文本文件。我希望这有帮助。谢谢。
我在 SQL Server 2008 R2 上重现了您的问题。解决方案就像在文件中添加一个换行符一样简单,以便最后一行以换行符结尾。
我创建了两个文件:
然后运行下面的脚本:
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'
。