Импорт самых последних данных из CSV в SQL Server с помощью служб SSIS.

Вот сделка; проблема не в том, чтобы загрузить CSV в SQL Server, а в том, чтобы заставить его работать так, как я хочу... что, я думаю, всегда проблема :)

У меня есть CSV-файл с такими столбцами: DATE, TIME, BARCODE, etc... Я использую преобразование производного столбца, чтобы объединить DATE и TIME в DATETIME для импорта в SQL Server, и я импортирую все данные в базу данных. Проблема в том, что мы получаем новый файл .CSV только каждые 12 часов, и, например, мы скажем, что .CSV обновляется четыре раза в минуту.

С логикой, согласно которой мы будем запускать задание каждые 15 минут, мы получим массу перекрывающихся данных. Я предполагаю, что буду использовать переменную, скажем, LastCollectedTime, которую можно извлечь из моей базы данных SQL, используя функцию MAX(READTIME). Моя проблема заключается в том, что я хочу собирать только строки с более поздним временем чтения, чем эта переменная.

Структура таблицы назначения: ID, ReadTime, SubID, ...datacolumns..., LastModifiedTime, где LastModifiedTime имеет значение по умолчанию GETDATE() при последней вставке.

Любые идеи? Помните, что наше время чтения — это производный столбец, не знаю, имеет ли это значение или нет.


person Tom    schedule 30.11.2011    source источник
comment
Не в этой ситуации, нет. Поставщик установил постоянную загрузку в .csv в течение 12 часов, а затем запускает новый .csv — это вне нашего контроля.   -  person Tom    schedule 01.12.2011


Ответы (1)


Вот один из подходов, который вы можете использовать:

Предположим, что ваша целевая таблица в SQL Server называется BarcodeData.

  1. Создайте в своей базе данных промежуточную таблицу (скажем, BarcodeStaging) с той же структурой столбцов, что и целевая таблица BarcodeData, в которую импортируются данные CSV.

  2. В пакете служб SSIS добавьте Execute SQL Task перед задачей потока данных, чтобы усечь промежуточную таблицу BarcodeStaging.

  3. Импортируйте данные CSV в промежуточную таблицу BarcodeStaging и не в реальную целевую таблицу.

  4. Используйте оператор MERGE (я предполагаю, что вы используете SQL Server 2008 или более позднюю версию), чтобы сравнить промежуточную таблицу BarCodeStaging и фактическую целевую таблицу BarcodeData, используя столбец DateTime в качестве ключа соединения. Если есть несопоставленные строки, скопируйте строки из промежуточной таблицы и вставьте их в целевую таблицу.

Ссылка Technet на заявление MERGE: http://technet.microsoft.com/en-us/library/bb510625.aspx

Надеюсь, это поможет.

person Community    schedule 30.11.2011
comment
Отлично сработало, спасибо! Хотелось бы, чтобы все это можно было сделать в SSIS, чтобы оставалось меньше места для ошибок, но на данный момент это жизнеспособное решение. - person Tom; 01.12.2011