Повторение первой проблемы:
- Есть папка
- Содержит 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 или чрезмерно сложную пользовательскую функцию сопоставления с шаблоном внешнего применения.