Автоматический импорт плоского файла в MS SQL Server 2008 - PullRequest
1 голос
/ 27 марта 2012

Передо мной стоит большая задача, я разбью 2 задачи (не уверен, что будет лучше поставить 2 отдельных вопроса).

После обратной связи я перенесу вторую проблему на новый вопрос.

Обзор: У меня есть большой список файлов, записываемых в каталог (по 1 в день), которые содержат много деталей. Мне нужно каким-то образом получить содержимое файлов в максимально удобном формате БД, чтобы затем выполнять запросы к ним.

Задача 1:

Автоматический импорт файлов в существующую таблицу. Файлы называются [DD] - [MMM] .txt (например, 27-Mar.txt).

Я думаю, что это должно быть просто с помощью мастера импорта / экспорта сервера, который выводит необработанный текст в строки из одного столбца.

Может кто-нибудь предложить метод сканирования файлов и импорта только новых, есть ли способ сделать это с помощью BULK INSERT?.

1 Ответ

3 голосов
/ 27 марта 2012

Повторение первой проблемы:

  • Есть папка
  • Содержит X количество файлов
  • Необходимо загружать данные в файлы по одному разу

Можно ли удалить файлы после загрузки данных?Вы можете заархивировать их (переместить в другую папку или просто переименовать)?Или следует предположить, что они всегда находятся в папке, или, по крайней мере, достаточно долго, чтобы помешать нескольким запускам загрузки данных?

Если файлы могут быть заархивированы после загрузки их данных, большой проблемы нет.Если файлы сохранятся, вы захотите зарегистрировать тот факт, что файл был загружен и обработан, и при последующих запусках для каждого найденного файла вы проверяете журнал, чтобы убедиться, что он уже загружен.(Примечание: поскольку имя файла не содержит года, после 364 дней использования у вас есть хитрая обработка. Предположим, что применяется текущий год, и вы должны быть хороши - если эти файлы не будут зависать вечнов таком случае, я думаю, файл перезаписывается с пропуском следующего года?)

Для решения, использующего только SQL, вам необходимо:

  • Загрузитьсписок файлов
  • Проверьте его по вашему LoadLog
  • Обработайте новые файлы

Фрагмент кода, описывающий, как это можно сделать (где @TargetFolder будет параметром):

DECLARE @Command  nvarchar(2000)

CREATE TABLE #ImportOSFiles (FileName  varchar(128))

SET @Command = 'DIR  "' + @TargetFolder + '\*.txt"  /b'

INSERT #TestFiles
 execute master.dbo.xp_cmdshell @Command

DELETE #ImportOSFiles
 where FileName is null

(обратите внимание, что использование xp_cmdshell может или не может быть приемлемым для ваших администраторов баз данных и / или архитектуры.)

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

CREATE TABLE #LoadData
 (Item  varchar(1000)  not null)


SET @Command = 'BULK INSERT #LoadData
 from ' + @ThisFile + '
 with
  (
    FieldTerminator = ''''  --  No delimiter
   --,RowTerminator = ''    --  Default is CR/LF
  )
'

EXECUTE sp_exectuesql @Command

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

INSERT #LoatData_Step2 (FileName, DataRow)
 select @TargetFile, Item
  from #LoadData

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...