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 的增量插入?的主要内容,如果未能解决你的问题,请参考以下文章