2016-01-20 2 views
0

Я ищу лучший способ решить эту проблему, так как мое текущее решение очень трудоемко и неэффективно.TSQL BULK INSERT: заполнить столбец с источником FileName

У меня есть несколько текстовых файлов, которые содержат 1 столбец.

Я использую BULK INSERT для загрузки этой информации в таблицу SQL, но я хотел бы указать, из какого файла были загружены данные и заполнить их в столбце.

Существующий технологический процесс заключается в создании серии INSERT и UPDATE заявления НАВАЛОЧНЫХ в текстовом редакторе, а затем запустить их один за другим, как показано ниже:

Существующие Workflow

CREATE TABLE #TEMP(MYDATA VARCHAR(MAX), FILENAME VARCHAR(MAX)) 

    BULK INSERT #TEMP FROM 'C:\MYFILE_1.TXT' WITH (FORMATFILE = 'C:\FORMATFILE.FRM') 

    UPDATE #TEMP SET FILENAME = 'MYFILE_1.TXT' WHERE FILENAME IS NULL 

    BULK INSERT #TEMP FROM 'C:\MYFILE_2.TXT' WITH (FORMATFILE = 'C:\FORMATFILE.FRM') 

    UPDATE #TEMP SET FILENAME = 'MYFILE_2.TXT' WHERE FILENAME IS NULL 

    BULK INSERT #TEMP FROM 'C:\MYFILE_3.TXT' WITH (FORMATFILE = 'C:\FORMATFILE.FRM') 

    UPDATE #TEMP SET FILENAME = 'MYFILE_3.TXT' WHERE FILENAME IS NULL 

Это страшный рабочий процесс и становится все медленнее и медленнее, чем больше строк вставляется в таблицу.

У кого-нибудь есть способ сделать это во время выполнения BULK INSERT или, по крайней мере, более эффективным способом?

Большое спасибо

+1

Рассматривали ли вы с помощью SSIS для работы, как это? Когда у вас более сложный рабочий процесс и т. Д., Преимущества использования SSIS становятся более очевидными. –

+0

Спасибо за ваш ответ @WindsofChange. Нет, я не заглядывал в маршрут SSIS. Можете ли вы дать мне приблизительный рабочий процесс о том, как это будет достигнуто, и тогда я пойду и сделаю собственное исследование? Спасибо – Ninja

+0

SSIS - инструмент ETL (извлечение, преобразование, загрузка). Это позволяет вам разработать процедуру загрузки и преобразования данных, которые вы загружаете. Например, вы можете загружать в свой источник данных (либо передаваться как параметр, либо вы можете прокручивать папку и загружать все там). Вы можете преобразовать загруженные данные, чтобы включить жестко закодированное значение (например, расположение файла источника данных) в столбце, который затем используется для массового вставки в вашу таблицу. Это больше связано с тем, что просто писать сценарий SQL, но гибкость намного больше для работы ETL, которая извлекает выгоду из реальных процедур. –

ответ

0

Как и большинство вопросов, я уверен, что есть много веских способов сделать это. Однако я бы сделал это динамически, объявив имя файла переменной, а затем вставив имя файла в объемную вставку. Это может быть немного сложнее, и вполне может быть сделано с использованием курсора.

Другой вариант - добавить столбец в файлы txt, равные имени файла. Я уверен, что это может быть сценарий с помощью PowerShell и т.д ..

Я знаю, что мой ответ расплывчатым, дайте мне знать, если вы хотите несколько примеров

+0

Спасибо за ваш ответ @E. Монах. Я рассмотрю опцию переменной. К сожалению, я не могу изменить исходные текстовые файлы, поскольку они находятся в определенной структуре. – Ninja