Массовая вставка проблемы с определителем строки - PullRequest
10 голосов
/ 13 сентября 2011

У меня есть этот CSV с именем test.csv с содержимым ниже

1,"test user",,,4075619900,example@example.com,"Aldelo for Restaurants","this is my deal",,"location4"
2,"joe johnson",,"32 bit",445555519,antle@gmail.com,"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,example@example.com,"Aldelo for Restaurants","this is my deal",NULL,"""location4""2,""joe johnson"",,""32 bit"",445555519,antle@gmail.com,""Restaurant Pro Express"",""smoe one is watching u"",,""some location"""

Я предполагаю, что проблема в ROWTERMINATOR, но я пробовал все эти

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

и все те же результаты ... любые идеи о том, как исправить это

Я создаю CSV, как это через PHP

Ответы [ 2 ]

25 голосов
/ 06 октября 2011

Я думаю, проблема в том, что ваш CSV-файл использует \n в качестве EOL (unix way).BULK INSERT в SQL Server является «умным», и даже если вы укажете ROWTERMINATOR как \n, что теоретически должно решить вашу проблему, ему будет предшествовать \r, так что в итоге вы получите \r\n в качестве ограничителя строки.

Попробуйте использовать ROWTERMINATOR='0x0A'.В этом случае SQL Server не выполняет никаких фокусов, а просто использует значение, заданное вами в качестве ограничителя строки.
Работает для меня.:)

1 голос
/ 13 сентября 2011

CHAR (124) - это |и CHAR (10) равен \ n

Возможно, вам нужно CHAR(13) и CHAR(10) в качестве терминатора строки

http://www.techonthenet.com/ascii/chart.php

...