SQL - 使用 SSIS 的增量插入?

Posted

技术标签:

【中文标题】SQL - 使用 SSIS 的增量插入?【英文标题】:SQL - Incremental insert using SSIS? 【发布时间】:2019-10-09 14:38:43 【问题描述】:

我有一个很大的表,我需要将其导入到我的 BI 环境中进行报告。我有一个 SSIS 包,它调用存储过程每 20 分钟运行一次以从源中提取数据并将其填充到我的表中。源表上的最早日期是 2012 年 1 月 1 日。

我想要的是包第一次运行时,它将从源中导入 2012 年 1 月的所有数据。下次运行时,它将填充 2012 年 2 月的所有数据,依此类推。

下面是我用来提取数据的查询 - 这是基于创建和修改日期

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

我只需要有关如何使这个增量来动态地逐月获取数据的帮助?

任何帮助将不胜感激

-杰斯

【问题讨论】:

我认为这里有两个不同的问题,我看到了这两个问题的答案。首先,您似乎希望将初始负载分解为块,但随后您希望定期运行以添加增量记录。你在说哪个? 【参考方案1】:

在您的存储过程中,从已加载的表中提取当前最大日期并根据该日期设置您的变量:

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

我喜欢这种方法,因为它可以在拉取失败时进行自我修复,即使您错过了几个月才注意到问题。

【讨论】:

我正要开始输入这个。 +1 阅读我的想法。 另外,@Jess8766,您可以将此策略用于初始加载和持续加载。【参考方案2】:

我会通过在 SQL Server 中创建元数据表来做到这一点。

每次运行包时,在该表中插入一个日期/标识符,以说明该月的任务已完成(作为您的最后一个包步骤)。对于第一个包步骤,您将使用该表来获取尚未完成的下个月(您将其存储在一个变量中以供以后插入使用)。 (您还有一个默认/开始月份,如果表为空,则使用该月份。)

【讨论】:

【参考方案3】:

您可以使用Change Tracking 来识别自上次更新以来修改的所有键,甚至是删除的键,而不是使用日期。自 2005 年以来,该功能在所有版本和版本中都可用,即使是 Express。

Work with Change Tracking (SQL Server) 展示了如何检索自上次同步操作以来对表所做的任何更改。

此查询将返回所有修改的行last_synchronization_version 中指定的版本以来,它们从Product 表中被修改的原因。任何已删除的行都会在SYS_CHANGE_OPERATION 字段中显示D

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(); 

这个查询非常快,因为它连接到表的主键上。

另一个好处是它不在乎你是否忘记运行它 - 它仍然会提取自上次执行以来的所有更改。更频繁地运行它会带来更好的性能,因为查询返回的更改更少。

【讨论】:

以上是关于SQL - 使用 SSIS 的增量插入?的主要内容,如果未能解决你的问题,请参考以下文章

无法使用自动增量插入到 SQL Server CE

SSIS+CDC 增量抽取数据

如何在 PL/SQL 中增量集成数据

将数据从 sql server 增量上传到 Amazon Redshift [关闭]

插入后的 T-SQL 增量 ID

如何在表中插入变量(@id)作为 SQL 服务器查询中的自动增量?