Массовая вставка SQL Server - PullRequest
4 голосов
/ 16 июня 2009

Я хочу импортировать текстовый файл с одним столбцом в одну из моих таблиц sql. Файл представляет собой просто список нецензурных слов.

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

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

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

Спасибо

Ответы [ 7 ]

10 голосов
/ 16 июня 2009

Для этого вам нужно использовать FORMATFILE. См. БОЛЬШАЯ ВСТАВКА .

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.

Для получения более подробной информации см. Использование файлов форматирования .

2 голосов
/ 16 июня 2009

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

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

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

1 голос
/ 16 июня 2009

Кроме того, вы можете создать представление на вашей таблице, основываясь только на столбце nvarchar, и затем НАСТРОИТЬ ВСТАВКУ в свое представление. Это очень чистый способ использования BULK INSERT.

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

Ваше утверждение BULK INSERT должно выглядеть так:

BULK INSERT vw_SwearWords FROM 'c:\swearwords.txt' WITH (ROWTERMINATOR = '\n')
0 голосов
/ 27 июня 2012

В 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/

0 голосов
/ 16 июня 2009

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

0 голосов
/ 16 июня 2009

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

0 голосов
/ 16 июня 2009

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

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

Марк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...