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 Server 2000、unix换行符_Sql_Sql Server_Bulkinsert - Fatal编程技术网

大容量插入、SQL Server 2000、unix换行符

大容量插入、SQL Server 2000、unix换行符,sql,sql-server,bulkinsert,Sql,Sql Server,Bulkinsert,我正在尝试使用unix换行符将.csv文件插入数据库。我正在运行的命令是: BULK INSERT table_name FROM 'C:\file.csv' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' ) 如果我将文件转换为Windows格式,加载会起作用,但如果可以避免的话,我不想执行此额外步骤。有什么想法吗?一个选项是使用,并设置一个控制文件,其中'\n'作为换行符 尽管您已表示不希望这样做,但另一个选

我正在尝试使用unix换行符将.csv文件插入数据库。我正在运行的命令是:

BULK INSERT table_name
FROM 'C:\file.csv' 
WITH 
( 
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n' 
) 

如果我将文件转换为Windows格式,加载会起作用,但如果可以避免的话,我不想执行此额外步骤。有什么想法吗?

一个选项是使用,并设置一个控制文件,其中
'\n'
作为换行符

尽管您已表示不希望这样做,但另一个选项是使用将文件预处理为带有
'\r\n'
换行符的文件


最后,您可以使用
批量插入
上的
格式化文件
选项。这将使用bcp控制文件来指定导入格式。

在我看来,有两种常见的方法可供选择:以其他方式读取SQL脚本中的CSV,或使用多种方法中的任意一种预先转换CSV(bcp、unix2dos,如果它是一次性的王牌,您甚至可以使用代码编辑器为您修复该文件)

但是你必须多走一步

如果此SQL是从程序启动的,则您可能希望转换该程序中的行尾。在这种情况下,您决定自己编写转换代码,以下是您需要注意的事项: 1.行结尾可能是\n 2.或\r\n 3.甚至\r(Mac!) 4.太好了,可能是某些行有\r\n而其他行有\r\n,任何组合都是可能的,除非您控制CSV的来源


好吧,好吧。可能性4是牵强的。它发生在电子邮件中,但那是另一个故事。

感谢所有回答的人,但我找到了我的首选解决方案

当您告诉SQL Server ROWTERMINATOR='\n'时,它解释为Windows下的默认行终止符,实际上是“\r\n”(使用C/C++表示法)。如果行终止符实际上只是“\n”,则必须使用下面显示的动态SQL

DECLARE @bulk_cmd varchar(1000)
SET @bulk_cmd = 'BULK INSERT table_name
FROM ''C:\file.csv''
WITH (FIELDTERMINATOR = '','', ROWTERMINATOR = '''+CHAR(10)+''')'
EXEC (@bulk_cmd)
我无法理解为什么不能说大容量插入…(rowtterminator=CHAR(10))。看起来您无法计算命令WITH部分中的任何表达式


上面所做的是创建一个命令字符串并执行它。巧妙地避开创建额外文件的需要或执行额外的步骤。

我认为“ROWTERMINATOR='\n'”会起作用。我建议使用显示“隐藏字符”的工具打开文件为了确保该行按您所想的那样终止。我使用notepad++处理类似的事情。

归结起来就是这样。Unix使用LF(ctrl-J),MS-DOS/Windows使用CR/LF(ctrl-M/ctrl-J)

当您在Unix上使用“\n”时,它会被转换为LF字符。在MS-DOS/Windows上,它会被转换为CR/LF。当您的导入在Unix格式的文件上运行时,它只会看到LF。因此,通常更容易首先通过unix2dos运行该文件。但正如您在原始问题中所说,您不想这样做(我想你有一个很好的理由不能这样做)

为什么你不能:

(ROWTERMINATOR = CHAR(10))
可能是因为在解析SQL代码时,它没有将字符(10)替换为LF字符(因为它已经用单引号括起来了)。或者可能它被解释为:

(ROWTERMINATOR =
     )

当您回显@bulk\u cmd的内容时会发生什么情况?

比这要复杂一点!当您告诉SQL Server ROWTERMINATOR='\n'时,它将其解释为Windows下的默认行终止符,实际上是“\r\n”(使用C/C++表示法)。如果您的行终止符只是“\n”您必须使用上面所示的动态SQL。我刚刚花了一个小时的大部分时间来弄清楚为什么与大容量插入一起使用时\n并不真正意味着\n!

我觉得有必要作出贡献,因为我遇到了同样的问题,我每天至少需要从SAP读取两个UNIX文件几次。因此,我不使用unix2dos,而是使用unix2dos需要更少的人工干预和更多的自动编程

如前所述,Char(10)在sql字符串中工作。我不想使用sql字符串,所以我使用了''''+-Char(10)+''',但由于某种原因,这没有编译

工作非常顺利的是:使用(rowdterminator='0x0a')

用十六进制解决问题


希望这对某人有所帮助。

我确认语法

ROWTERMINATOR = '''+CHAR(10)+'''
与EXEC命令一起使用时工作

如果有多个行终止符字符(例如管道和unix换行符),则其语法为:

ROWTERMINATOR = '''+CHAR(124)+''+CHAR(10)+'''

确实如此,因此它能够使用bcp文件指定输入格式。感谢@Randy J。更改了接受的答案,因为这是一个更好的解决方案。不幸的是,这对以LF终止的unix文件不起作用,但动态SQL解决方案确实起作用了!谢谢!我只浪费了大约10分钟的时间在使用行终止符之前或者我找到了这篇文章。可能会更糟……是的,Randy,这很有帮助!我记得有一种方法可以指定十六进制字符,当然还有a=hex 10,但我记不起语法。非常感谢(我快发疯了)。谢谢!!你每个月为我节省了两个小时!是的,你会认为它会起作用。我们大多数人也是如此。但事实并非如此。
\n
会自动替换为
\r\n
,因此需要其他变通方法来自行获得LF。