合并语句VS查找转换

时间:2014-05-07 21:29:00

标签: sql-server-2012 ssis

我遇到了不同观点的问题。

目前的情景:

我使用SSIS包每15分钟从服务器A到服务器B获取数据。为10个不同的表处理了10个包,并为此创建了10个临时表。在DataFlow任务中,它从服务器A中选择ID较大的最后导入ID,并将它们转储到Staging表上。(每个表都有自己的停滞表)。在DataFlow任务之后,我使用MERGE语句从Staging合并记录表到目标表,其中ID为“无匹配”。

问题:

这会照顾所有插入的新记录,但是如果SSIS作业选择了一条记录并且在源处更新,我将无法再次获取它并且无法获取更新的数据。

问题:

  • 如何通过过多地影响源数据库服务器来实现更新。
  • 我是否每次使用MERGE语句并选择10,000条记录?(每15分钟一次)
  • 我是否使用LookUp转换进行更新
  • 有些表有超过200万条记录并且还在增长,所以对他们来说最好的方法是什么。

注意:

我可以截断目标中的表并重新插入第一次运行的完整数据。

编辑:

来源有一栏' LAST_UPDATE_DATE'我可以在我的查询中使用。

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的陈述,听起来您似乎非常接近您的解决方案。如果您当前有一个包含插入的merge语句(其中source与目标不匹配),您应该能够轻松地包含(其中source匹配目标)的update语句。

示例:

MERGE target_table as destination_table_alias
USING ( 
SELECT <column_name(s)>
 FROM  source_table
) AS source_alias
ON 
 [source_table].[table_identifier] = [destination_table_alias].[table_identifier]

WHEN MATCHED THEN UPDATE 
SET [destination_table_alias.column_name1] = mySource.column_name1,
    [destination_table_alias.column_name2] = mySource.column_name2
WHEN NOT MATCHED THEN
INSERT 
([column_name1],[column_name2])
VALUES([source_alias].[column_name1],mySource.[column_name2])

所以,对你的观点:

  1. 更新可以通过&#39; WHEN MATCHED&#39;来实现。合并声明中的逻辑
  2. 如果您有正在加载的表的最后一个ID,则可以将其作为过滤器包含在select语句中,以便数据集是增量式的。
  3. &#39; WHEN MATCHED&#39;不需要查找。利用。
  4. 在合并语句的选择部分中使用选择过滤器。
  5. 希望这有帮助