2009-06-16 4 views
4

Я хочу импортировать текстовый файл с одним столбцом в одну из моих таблиц sql. Файл - это всего лишь список ругательных слов.SQL Server Bulk Insert

Я написал следующее TSQL сделать это

BULK INSERT SwearWords 
FROM 'c:\swears.txt' 
WITH 
(
FIELDTERMINATOR = ',', 
ROWTERMINATOR = '\n' 
) 

Однако это ошибки с unexapected конца файла. Импорт таблицы im - это только поле идентификатора, за которым следует поле nvarchar, в которое я хочу вставить текст. Он отлично работает, если я добавлю в текстовый файл «1» к началу строки eveyr, я предполагаю, что это потому, что SQL ищет 2 поля. Есть ли способ обойти это?

Благодаря

+0

По какой причине вы не хотите использовать SSIS? – zvolkov

ответ

10

Вы должны использовать FORMATFILE для этого. См. BULK INSERT.

FORMATFILE [ 'format_file_path' =]

Задает полный путь формата файла. Файл формата описывает файл , содержащий сохраненные ответы , созданный с использованием утилиты bcp на той же таблице или представлении. Формат файла должен использоваться в тех случаях, в которых:

* The data file contains greater or fewer columns than the table or view. 

* The columns are in a different order. 

* The column delimiters vary. 

* There are other changes in the data format. Format files are usually created by using the bcp utility and modified with a text editor as needed. For more information, see bcp Utility. 

Для получения более подробной информации см Using Format Files.

+0

+1 интересный - спасибо! Я не знал о файле формата и о том, что они могут сделать для массовой вставки - отличный совет, спасибо! –

+2

Как насчет примера FORMATFILE для вставки с другим количеством столбцов? На удивление трудно найти его. –

0

Вы должны убедиться, что структура текстового файла и матч таблицы - если таблица имеет два поля, то вы должны будете предоставить два поля/столбцов в текстовом файле, а также.

Поскольку первый столбец в таблице SQL является полем IDENTITY, вы можете предоставить любое значение, которое вы хотите - но вы должны иметь там значение, я не думаю, что это возможно.

Marc

+0

разве это не то же самое, что написано в OP? –

+0

По существу, да - но ОП, похоже, не знал, почему .... – RolandTumble

+0

@Stan: Я мог бы поклясться, что пост не включал заявление «BULK» - просто «INSERT» - ну, должен был пропустить это ... –

0

Проверить последняя строка имеет CR/LF (\ г \ п). Иногда это проблема, а иногда еще один возврат каретки находится в конце файла. Вы можете проверить это с помощью гекседера.

0

Вы можете удалить столбец идентификации и вернуть его, когда закончите. В качестве альтернативы, если это нарушает ваши отношения с базой данных, вы можете сделать импорт с использованием DTS или SSIS, если это некорректный импорт - более гранулированный контроль возиться со столбцами

1

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

Таким образом, вам не нужно беспокоиться о столбце IDENTITY или создании файла формата.

Ваш BULK оператор INSERT должен выглядеть следующим образом:

BULK INSERT vw_SwearWords FROM 'c:\swearwords.txt' WITH (ROWTERMINATOR = '\n') 
2

Это описано в книгах на линии для BULK INSERT в соответствии с аргументом KEEPIDENTITY. Вот что говорит

KEEPIDENTITY Указывает, что значения для столбца идентификации присутствуют в файле импортированной.Если KEEPIDENTITY не указан, значения идентификатора для этого столбца в импортированном файле данных игнорируются, и SQL Server автоматически присваивает уникальные значения на основе значений семян и приращений, указанных при создании таблицы. Если файл данных не содержит значений для столбца идентификации в таблице или представлении, используйте файл формата, чтобы указать, что столбец идентификатора в таблице или представлении должен быть пропущен при импорте данных; SQL Server автоматически присваивает уникальные значения для столбца

Таким образом, либо использовать формат файла или поставить фиктивное значение и убедитесь, что не использовать KEEPIDENTITY аргумент

0

В SQL Server 2008 я нашел, что это проще просто создать файл, содержащий много вставок, как это так, и вставьте его в окно запроса Management Studio, а не бороться с получением файла формата и разрешения для файлов массовой вставки впору:

USE YourDB 
GO 
INSERT INTO MyTable (FirstCol, SecondCol) 
VALUES ('First',1), 
('Second',2), 
('Third',3), 
('Fourth',4), 
('Fifth',5) 

http://blog.sqlauthority.com/2008/07/02/sql-server-2008-insert-multiple-records-using-one-insert-statement-use-of-row-constructor/