Массовая загрузка SQL SERVER

#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 пути для хранения файлов.