Мастер импорта SQL Server обрабатывает NULL как литеральную строку «NULL»

Когда я пытаюсь импортировать плоский файл с разделителями-запятыми .csv в Microsoft SQL server 2008R2 64-bit instance, для string столбцов NULL в исходных данных становится буквальной строкой "NULL", а в столбце numeric я получаю сообщение об ошибке импорта. Кто-нибудь может помочь???


person Erik Johnson    schedule 27.06.2013    source источник


Ответы (3)


Поместите данные в промежуточную таблицу, а затем вставьте в рабочую таблицу с помощью кода SQL.

update table1
set field1 = NULL
where field1 = 'null'

Или если вы хотите сделать много полей

update table1
    set field1 = case when field1 = 'null' then Null else Field1 End
      , field2 = case when field2 = 'null' then Null else Field2 End
      , field3 = case when field3 = 'null' then Null else Field3 End
person HLGEM    schedule 27.06.2013
comment
Это ужасное, ужасное решение. NULL — это совершенно допустимая строка, а не нуль, поэтому не рассматривайте ее как таковую. Именно такие вещи и приводят к проблемам всех бедняков с Нулевой фамилией. - person Voo; 22.08.2016
comment
@Voo, ты вопрос читал? Null не является допустимым значением для OP. - person HLGEM; 22.08.2016
comment
@HLGEM OP также говорит о строковых столбцах и нигде ничего не говорит о том, является ли NULL допустимым или нет - просто NULL вызовет ошибку в целочисленных столбцах. - person Voo; 22.08.2016
comment
Ха, какой некротред. Я зашел, чтобы проверить свой старый вопрос и увидел это. @Voo, хотя вы правы в том, что это вызвало бы проблемы, если бы NULL был допустимым вводом, в моем случае это было не так, и отбрасывание этих значений было правильным. - person Erik Johnson; 03.11.2020

ЦЕЛОВАТЬ

Предварительно обработайте его, замените все «NULL» на «».

т.е. файл .csv будет иметь

,,

Вместо

NULL,NULL,

Кажется, делает работу за меня.

person Max Robbertze    schedule 06.07.2015

Добавляя к ответу HLGEM, я делаю это динамически, я загружаю в промежуточную таблицу, здесь все типы столбцов VARCHAR, а затем делаю:

DECLARE @sql VARCHAR(MAX) = '';
SELECT @sql = CONCAT(@sql, '
    UPDATE [staging].[',[TABLE_NAME],']
    SET [',[COLUMN_NAME],'] = NULL
    WHERE [',[COLUMN_NAME],'] = ''NULL'';
    ')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE [TABLE_SCHEMA] = 'staging' 
    AND [TABLE_NAME] IN ('MyTableName');
SELECT @sql;
EXEC(@sql);

Затем выполните:

INSERT INTO [dbo].[MyTableName] ([col1], [col2], [colN])
SELECT [col1], [col2], [colN]
FROM [staging].[MyTableName]

Если таблица [dbo].[MyTableName] определена с желаемыми типами столбцов, это также терпит неудачу и сообщает вам об ошибках преобразования типов...

person Morad    schedule 22.09.2014