Массовая вставка SQL Server
-
05-07-2019 - |
Вопрос
Я хочу импортировать текстовый файл с одним столбцом в одну из моих таблиц 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)