#sql #sql-server #tsql #bulkinsert #bulk-load
#sql #sql-сервер #tsql #bulkinsert #массовая загрузка
Вопрос:
Я работаю над SQL Server 2017. Мне нужно импортировать 20 текстовых файлов в одну таблицу. Каждый текстовый файл имеет один и тот же тип данных и имя столбца. Я проверил данные, и они также расположены в том же порядке. Мне нужно импортировать таблицу SQL и создать новый столбец, в последнем столбце указано, что
Данные из строк с 1 по 150 поступают из «textfile-1»
Данные из строк с 151 по Row300 поступают из «textfile-2»
Данные из строк с 301 по Row400 поступают из «textfile-3»
У нас нет никаких пакетов, подобных SSIS.
Можем ли мы сделать это заранее в SQL запросе? если да, может ли кто-нибудь, пожалуйста, направить меня
Комментарии:
1. Если файлы находятся на SQL Server, вы можете сделать это довольно легко с помощью
INSERT table(columns, extracolumn) SELECT columns, 'textfile-1' FROM OPENROWSET(BULK, ...)
. Вы даже можете выполнить этот запрос с помощьюUNION ALL
. Смотрите также . Если файлы находятся не на SQL Server, вы все равно можете выполнить это с помощью локального экземпляра, затем используйте мастер импорта / экспорта данных, чтобы скопировать конечный результат. Все это предполагает, что вы импортируете данные только один раз; при повторном импорте более уместно тратить время на изучение SSIS.2. Вы могли бы использовать
BULK INSERT
, да, но вам нужно будет написать скрипт для каждого файла. В качестве альтернативы, вы могли бы использовать SSIS и a для каждого контейнера цикла и просматривать каждый файл, повторно используя одну и ту же задачу потока данных (при условии, что все файлы действительно имеют одинаковое определение).3. @avinash На мой взгляд, SSIS идеально соответствует требованиям. Вы можете легко загружать все файлы в цикле. Не забывайте использовать промежуточную таблицу. Имя исходного файла можно очень легко получить при приеме данных, применив простое изменение свойства согласно sqlblog.com/blogs/jamie_thomson/archive/2010/03/31 /…
4. Если вы знакомы с c #, ознакомьтесь с этим проектом: github.com/munchy-bytes/SchemaMapper/wiki /…
Ответ №1:
МАССОВАЯ ВСТАВКА SQL
Прежде всего, вы должны убедиться, что структура таблицы идентична файловой структуре.
Вы можете сохранить путь к текстовым файлам внутри таблицы, перебирать эти значения с помощью курсора, динамически создавать команду, а затем выполнять команду:
DECLARE @strQuery VARCHAR(4000)
DECLARE @FileName VARCHAR(4000)
DECLARE file_cursor CURSOR
FOR SELECT FilePath FROM FilesTable
OPEN file_cursor
FETCH NEXT FROM file_cursor INTO @FileName;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @strQuery = 'BULK INSERT SchoolsTemp
FROM ''' @FileName '''
WITH
(
FIELDTERMINATOR = '','', --Columns delimiter
ROWTERMINATOR = ''n'', --Rows delimiter
TABLOCK
)
EXEC(@strQuery)
FETCH NEXT FROM file_cursor INTO @FileName;
END
CLOSE file_cursor
DEALLOCATE file_cursor
Дополнительная информация
Подход C #: библиотека классов SchemaMapper
Если вы знакомы с C #, недавно я запустил новый проект на Github, который представляет собой библиотеку классов, разработанную с использованием C #. Вы можете использовать его для импорта табличных данных из Excel, word, powerpoint, text, csv, html, json и xml в единую таблицу SQL server. проверьте это на:
Пошаговое руководство можно найти на этой вики-странице:
Комментарии:
1. Спасибо за предложение и код. Я новичок в этом, и мне нужно немного больше разъяснений. Куда мне поместить имя папки? Куда мне поместить имя файла?
2. Создайте таблицу. Вызываются,
filestable
которые имеют 2 столбцаID
иFilename
пути для хранения файлов.