Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 大容量插入缺少最后一行?_Sql_Sql Server_Sql Server 2008_Coldfusion_Bulkinsert - Fatal编程技术网

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变量周围有双引号。现在,我正在为每个上传的文件添加换行符。谢谢你的帮助。我认为这是解决这个问题的唯一办法。我在网上找不到任何其他东西可以修复这个错误。如果有人上传了他们的文件,一个副本将使用您或同事应该可以使用的代码发送到您的服务器。这段代码可以把文件放在任何你想要的地方。