SQL не будет вставлять значения null с BULK INSERT

У меня есть файл CSV, и каждая строка выглядит так:

EASTTEXAS,NULL,BELLVILLE AREA,NULL,BELLVILLE AREA,RGP,NULL,NULL,0,NULL,NULL,NULL,1,1,PM,PM Settings,NULL,NULL

Я не мог найти примеров того, как значения NULL должны обрабатываться при выполнении BULK INSERT, поэтому я предположил, что это нормально.

когда я пытаюсь запустить массовую вставку, это дает мне эту ошибку:

Msg 4864, Уровень 16, Состояние 1, Строка 28 Ошибка преобразования данных массовой загрузки (несоответствие типа или недопустимый символ для указанной кодовой страницы) для строки 1, столбец 12 (ClassificationPK).

вот мой стол, а что нет:

CREATE TABLE #Assets
(
ParentID VARCHAR(255) NULL,
ClassificationID VARCHAR(255) NULL,
AssetID VARCHAR(255) NULL,
AssetType VARCHAR(255) NULL,
AssetName VARCHAR(255) NULL,
RepairCenterID VARCHAR(255) NULL,
LaborID VARCHAR(255) NULL,
Owner VARCHAR(255) NULL,
IsLocation VARCHAR(255) NULL,
AssetTypeDesc VARCHAR(255) NULL,
ClassificationName VARCHAR(255) NULL,
ClassificationPK INT NULL,
IsUp BIT NULL,
RequesterCanView BIT NULL,
PMCycleStartBy VARCHAR(255) NULL,
PMCycleStartByDesc VARCHAR(255) NULL,
PMCycleStartDate DATETIME NULL,
PMCounter INT NULL,
ParentPK INT NULL,
ParentName VARCHAR(255) NULL,
AssetPK INT NULL,
RepairCenterPK INT NULL,
RepairCenterName VARCHAR(255) NULL,
LaborPK INT NULL)

BULK
INSERT #Assets
FROM 'cdmsqlint01dropassets.csv'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = 'n',
KEEPNULLS
)
GO

SELECT * FROM #Assets

DROP TABLE #Assets

любые идеи о том, что я делаю неправильно здесь?

2 ответов


по:

http://msdn.microsoft.com/en-us/library/ms187887.aspx

значения null можно вставить, имея пустое поле в вашем файле.

пример файла:

1,,DataField3
2,,DataField3

пример метода импорта файлов с сохранением нулей:

USE AdventureWorks;
GO
BULK INSERT MyTestDefaultCol2
FROM 'C:\MyTestEmptyField2-c.Dat'
WITH (
    DATAFILETYPE = 'char',
    FIELDTERMINATOR = ',',
    KEEPNULLS
);
GO

конечно, это означает, что вам придется изменить "NULL " на"", и любые пустые строки, которые вы хотели как пустую строку, будут интерпретироваться как нули, но это может хватит, чтобы начать? Я бы предположил, чтобы сохранить ваши пустые столбцы строк, их нужно было бы изменить с

field1,,field2

до

field1,"",field2

в качестве примера


поздний PS.

обратите внимание, что, кажется, есть ошибка если последнем столбце это DATETIME тип и значение null, тогда у вас должен быть (обычно избыточный, но принятый) разделитель полей после пустого поля, перед разделителем строк, или вы получите ошибку.

ADD: это не работает последовательно (иногда это делает, хотя!?!?), чтобы сделать его стабильным, измените свой ROWterminator, чтобы начать с FIELDterminator

например, FIELDTERMINATOR ='#', ROWTERMINATOR = '#\n'

Ниже приведен пример ошибки, которую вы получаете, когда она все портит:

ошибка преобразования данных массовой загрузки (тип несоответствие или недопустимый символ для указанной кодовой страницы) для строки 1, столбец 31 (MyDateTimeField).

(и да, я попробовал весь пример ASCII с менее чем 7F символами и получил же)

пример:

первые громады терпят неудачу много. Другой терпит неудачу только на пятом, несмотря на сходство со вторым, но в этом частном случае ничего не допускается в конце...

тестовые данные:

1#2017-06-13 19:00:11.247#0##2017-06-13 19:00:11.247#
2#2017-06-13 19:09:08.817#0##2017-06-13 19:00:11.247#123#
3#2017-06-13 18:44:07.980#1###
4#2017-06-13 09:39:18.367#11## #
5#2017-06-13 09:39:18.370#4###123#

и sql

CREATE TABLE TEST_Bulk(
    id int,
    ts1 datetime,
    txt varchar(40) NULL,
    ts2 datetime,
    ts3 datetime,
) 
GO

BULK INSERT TEST_Bulk FROM 'D:\File.txt' WITH (FIRSTROW=1, FIELDTERMINATOR = '#', ROWTERMINATOR = '\n', CODEPAGE= 'ACP' ,TABLOCK)

BULK INSERT TEST_Bulk FROM 'D:\File.txt' WITH (FIRSTROW=1, FIELDTERMINATOR = '#', ROWTERMINATOR = '#\n', CODEPAGE= 'ACP' ,TABLOCK)

select * from TEST_Bulk

drop table TEST_Bulk