SQL - инкрементная вставка с использованием служб SSIS? - PullRequest
2 голосов
/ 09 октября 2019

У меня довольно большая таблица, которую нужно импортировать в мою среду BI для составления отчетов. У меня есть пакет служб SSIS, который вызывает хранимую процедуру, запускаемую каждые 20 минут, чтобы извлечь данные из источника и заполнить их в моей таблице. Самая ранняя дата в исходной таблице - 1 января 2012 года.

Мне хотелось бы, чтобы при первом запуске пакета он импортировал все данные из источника в январе 2012 года. В следующий раззапускается, заполняет все данные за февраль 2012 г. и т. д.

Ниже приведен запрос, который я бы использовал для извлечения данных - он основан на датах создания и изменения

Select ID, Name, Company, Job, HRID, PayID, CreatedOn, ModifiedOn
from dbo.HRDetails
where CreatedOn between @MonthStart and @MonthEnd
or ModifiedOn between @MonthStart and @MonthEnd

Мне просто нужна помощь в том, как сделать это постепенно, чтобы динамически подбирать данные за месяц?

Буду признателен за любую помощь

-Джесс

Ответы [ 3 ]

2 голосов
/ 09 октября 2019

В вашей хранимой процедуре извлеките текущую максимальную дату из загруженной таблицы и установите свои переменные на основе этого:

DECLARE @DateLoaded = ISNULL((SELECT MAX(dateField) FROM yourLoadedTable),'20120101') --MAX date loaded
DECLARE @MonthStart = DATEADD(DAY,1,EOMONTH(@DateLoaded)) --End of max loaded month, plus 1 day to get first day of next month
DECLARE @MonthEnd = EOMONTH(@DateLoaded, 1) --End of next month

Select ID, Name, Company, Job, HRID, PayID, CreatedOn, ModifiedOn
from dbo.HRDetails
where CreatedOn between @MonthStart and @MonthEnd
or ModifiedOn between @MonthStart and @MonthEnd

Мне нравится этот тип подхода, потому что он самовосстанавливается в случае сбоя извлечения,даже если вы пропустили несколько месяцев, прежде чем заметили проблему.

0 голосов
/ 09 октября 2019

Вместо использования дат можно использовать Отслеживание изменений , чтобы идентифицировать все ключи, измененные с момента последнего обновления, даже удаленные. Эта функция доступна во всех версиях и выпусках с 2005 года, даже в Express.

Работа с отслеживанием изменений (SQL Server) показывает, как можно извлечь любые изменения, внесенные в таблицу со времени последней синхронизацииоперация.

Этот запрос вернет все измененные строки и причину, по которой они были изменены из таблицы Product, начиная с версии, указанной в last_synchronization_version. Любые удаленные строки появятся с D в поле SYS_CHANGE_OPERATION:

SELECT  
    CT.ProductID, P.Name, P.ListPrice,  
    CT.SYS_CHANGE_OPERATION, CT.SYS_CHANGE_COLUMNS,  
    CT.SYS_CHANGE_CONTEXT  
FROM  
    SalesLT.Product AS P  
RIGHT OUTER JOIN  
    CHANGETABLE(CHANGES SalesLT.Product, @last_synchronization_version) AS CT  
ON  
    P.ProductID = CT.ProductID

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

SET @synchronization_version = CHANGE_TRACKING_CURRENT_VERSION(); 

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

Еще одна приятная вещь в том, что вам все равно, если вы забудете его запустить - он все равно будет извлекать все изменения с момента последнего выполнения. Более частый запуск приводит к повышению производительности, поскольку в запросе меньше возвращаемых изменений.

0 голосов
/ 09 октября 2019

Я бы сделал это, создав таблицу метаданных в SQL Server.

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

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