2011-09-13 70 views
10

我有这个CSV命名test.csv下面批量插入ROWTERMINATOR问题

1,"test user",,,4075619900,[email protected],"Aldelo for Restaurants","this is my deal",,"location4" 
2,"joe johnson",,"32 bit",445555519,[email protected],"Restaurant Pro Express","smoe one is watching u",,"some location" 

下面的内容是我的SQL文件做批量插入

USE somedb 
GO 

CREATE TABLE CSVTemp 
(id INT, 
name VARCHAR(255), 
department VARCHAR(255), 
architecture VARCHAR(255), 
phone VARCHAR(255), 
email VARCHAR(255), 
download VARCHAR(255), 
comments TEXT, 
company VARCHAR(255), 
location VARCHAR(255)) 
GO 

BULK 
INSERT CSVTemp 
FROM 'c:\test\test.csv' 
WITH 
(
FIELDTERMINATOR = ',', 
ROWTERMINATOR = '''+CHAR(124)+''+CHAR(10)+''' 
) 
GO 
--Check the content of the table. 
SELECT * 
FROM CSVTemp 
GO 

但发生了什么是它的唯一插入来自第二条记录的一条记录和所有信息正被插入到第一条记录的位置字段中

id,name,department,architecture,phone,email,download,comments,company,location 
    1,"test user",NULL,NULL,4075619900,[email protected],"Aldelo for Restaurants","this is my deal",NULL,"""location4""2,""joe johnson"",,""32 bit"",445555519,[email protected],""Restaurant Pro Express"",""smoe one is watching u"",,""some location""" 

我认为问题是ROWTERMINATOR但我想所有这些

ROWTERMINATOR = '\n' 
ROWTERMINATOR = '\r\n' 
ROWTERMINATOR = '\r' 

和所有相同的结果...关于如何解决这一问题

我通过PHP

创造一个像 this的CSV任何想法
+0

你试过'\ n \ r'吗? CSV文件来自哪里?是否有可能在行尾有一些非打印字符? –

+0

我通过服务器上的php生成它...我将更新我的问题 – Trace

+1

也许显示您用于生成CR + LF的PHP。 –

回答

25

我认为问题是,你的csv文件使用\n为EOL(UNIX方式)。 SQL Server中的BULK INSERT是“聪明的”,即使你指定ROWTERMINATOR\n,理论上它应该可以解决你的问题,但它会使用\r作为前缀,因此最后会以\r\n作为行终止符。

尝试使用ROWTERMINATOR='0x0A'。在这种情况下,SQL Server不执行任何魔术技巧,只是使用您设置的值作为行终止符。
适合我。 :)

+0

你可以用特殊的格式来标记代码,在markdown帮助中有更多的信息,看起来像是第一个很好的答案 –

+0

如果只有我有不止一个upvote给...感谢Przemek Ptasznik –

+0

我在这个问题上花了几个小时!你节省了我的一天,谢谢!多么愚蠢的“聪明”功能! – graycrow