Sql 大容量插入缺少最后一行?
我对文本文件使用大容量插入。一切正常,但我发现一件事,如果我给最后一行的最后一列一个值,它将导入。如果最后一行中最后一列的值为空,它将丢弃该行,尽管目标列允许空值!文本文件使用制表符分隔符,下面是最后一行数据的示例:Sql 大容量插入缺少最后一行?,sql,sql-server,sql-server-2008,coldfusion,bulkinsert,Sql,Sql Server,Sql Server 2008,Coldfusion,Bulkinsert,我对文本文件使用大容量插入。一切正常,但我发现一件事,如果我给最后一行的最后一列一个值,它将导入。如果最后一行中最后一列的值为空,它将丢弃该行,尽管目标列允许空值!文本文件使用制表符分隔符,下面是最后一行数据的示例: Mike Johnson 1/29/1987 M 如果在最后一列字段中有任何值,将插入行,示例如下: Mike Johnson 1/29/1987 M test 这是我的批量插入: BULK INSERT ##TEMP_TEXT FROM '#uncdi
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\u cmdshell'echo.>>C:\temp\without_newline.txt'
在执行大容量插入之前。是否尝试了\r\n
?我尝试了,但这导致了错误:coldfusion.tagext.sql.QueryTag$DatabaseQueryException:执行数据库查询时出错。我还尝试对行确定符使用“0x0a”。最后一个字段没有制表符来完成行?因为即使对于NULL
值,最后一个分隔符也必须在那里。我有一个选项卡和空值/字段。在这种情况下,我的insert跳过最后一行。若我像上面显示的那个样输入任何值,那个么行将被插入到db中。我最终实现了这一点,添加了新行,这就解决了问题。在我编写这段代码时,我想到了一件事。命令cmdshell正在向文件添加新行,如果该文件不在我的计算机上,我将如何检测该文件的根/文件夹?假设其他用户想要上传他/她的文件,并且该文件在他们的计算机上。在这种情况下,我使用的目录将不同,这将解决问题。我不完全确定我是否听懂了。批量插入命令中的数据\u文件
不涉及“检测”。说明:“data_文件必须指定运行SQL server的服务器的有效路径。如果data_文件是远程文件,请指定通用命名约定(UNC)名称。”。尽管SQL Server帐户可能没有写访问权限。那样的话,你就无能为力了。可能会复制帐户具有写入权限的文件?@espresso_coffee让生成数据文件的进程使用终止换行符生成数据文件可能会更好。我终于做到了。问题在于我在xp_cmdshell命令中输出的coldfusion变量周围有双引号。现在,我正在为每个上传的文件添加换行符。谢谢你的帮助。我认为这是解决这个问题的唯一办法。我在网上找不到任何其他东西可以修复这个错误。如果有人上传了他们的文件,一个副本将使用您或同事应该可以使用的代码发送到您的服务器。这段代码可以把文件放在任何你想要的地方。