Вопрос

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

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

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

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

Спасибо

Это было полезно?

Решение

Для этого вам нужно использовать FORMATFILE.Видеть ОБЪЕМНАЯ ВСТАВКА.

ФОРМАТФАЙЛ [ = 'путь_файла_формата' ]

Задает полный путь к формату файл.Файл формата описывает данные файл, содержащий сохраненные ответы созданный с помощью утилиты 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.

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

Другие советы

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

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

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

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

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

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

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

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

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

Марк

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top