2013-03-23 4 views
4

Таблица примеров содержит поля Id (идентификатор таблицы, целое число); Name (простой атрибут, который позволяет нулевые значения, это строка)Вставить пустую строку на SQL Server с BULK INSERT

Я пытаюсь в CSV, который содержит следующее:

1,

1 ""

1, ''

Ни один из них не дает мне пустую строку в результате массового ввода. Я использую SQL Server 2012.

Что я могу сделать?

+0

Пожалуйста, поделитесь вашим код – 2013-03-23 01:26:46

ответ

3

Насколько я знаю, объемная вставка не может вставить пустую строку, она может либо сохранить значение null, либо использовать значение по умолчанию с опцией keepnulls или без опции keepnulls. Для ваших 3 образца записей, после того, как базы данных вставки, она должна быть как:

 
    | id | name 
    | 1  | NULL 
    | 1  | "" 
    | 1  | '' 

Причина, основная вставка будет рассматривать первую строку, второе значение столбца в нуль; для других 2 строк примет второе значение столбца как не равное нулю, и возьмет его как есть.

Вместо того, чтобы Bulk Insert вставлять для вас значение пустой строки, вы можете позволить столбцу таблицы, имеющему значение по умолчанию, как пустую строку.

Пример следующим образом:


CREATE TABLE BulkInsertTest (id int, name varchar(10) DEFAULT '') 

Bulk Insert same CSV file into table
BULK INSERT Adventure.dbo.BulkInsertTest 
    FROM '....\test.csv' 
    WITH 
     (
     FIELDTERMINATOR ='\,', 
     ROWTERMINATOR ='\n' 
    ) 
    SELECT * FROM BulkInsertTest 

Результат будет как следующее: (Первая строка в CSV получит пустую строку)

 
    | id | name 
    | 1  | 
    | 1  | "" 
    | 1  | '' 
+0

GOT гайки все это время, глядя на Интернет для другого ответа ... там не было. Спасибо за ответ! – mishamosher

0

Пожалуйста, имейте в помните, что указанное значение DEFAULT будет вставлено только в том случае, если вы не используете параметр KEEPNULLS. Используя тот же пример, что и выше, если добавить опцию KEEPNULLS к BULK INSERT, а именно:

BULK INSERT BulkInsertTest 
FROM '....\test.csv' 
WITH 
(
    FIELDTERMINATOR ='\,', 
    ROWTERMINATOR ='\n', 
    KEEPNULLS 
) 

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

SELECT * FROM BulkInsertTest 

теперь будет давать вам:

id name 
1 NULL 
1 "" 
1 '' 

не кажется Там быть хорошая причина, чтобы добавить KEEPNULLS тыс в вашем примере, но я столкнулся с аналогичной проблемой только сейчас, где KEEPNULLS был необходим в BULK INSERT.

Мое решение было определить, сделать столбец [name] в промежуточной таблице BulkInsertTestNOT NULL, но помните, что значение столбца DEFAULT игнорируется и пустая строка Вставляется вместо этого.

Подробнее здесь: Keep Nulls or UseDefault Values During Bulk Import (SQL Server)