【问题标题】:SQL - Incremental insert using SSIS?SQL - 使用 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

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

任何帮助将不胜感激

-杰斯

【问题讨论】:

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

标签: sql sql-server ssis


【解决方案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(); 
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多