SSIS(在SQL Server 2012中):在Lookup组件中进行Upsert

时间:2014-10-10 21:27:26

标签: sql sql-server ssis ssis-2012

我有>需要在数据流中更新/插入的10个包。我可以通过以下方式完成:

  • Lookup =>匹配输出分支=> OLE DB命令。
  • Lookup =>无匹配输出分支=> OLE DB目的地。

http://www.rad.pasfu.com/index.php?/archives/46-SSIS-Upsert-With-Lookup-Transform.html) (http://jahaines.blogspot.com/2009/09/sss-performing-upsert.html

但是,我想知道是否有某些方法可以在Lookup(或任何其他)组件中使用“Merge”语句,以便我可以执行以下操作:

MERGE [DBPrac].[dbo].[TargetTable] AS tt
USING [SourceTable] AS st ON tt.Id = st.Id

WHEN MATCHED THEN --* Update the records, if record found based on Id.
   UPDATE 
      SET tt.SSN = st.SSN 
          ,tt.FirstName = st.FirstName
          ,tt.MiddleName = st.MiddleName
          ,tt.LastName = st.LastName
          ,tt.Gender = st.Gender
          ,tt.DateOfBirth = st.DateOfBirth
          ,tt.Email = st.Email
          ,tt.Phone = st.Phone
          ,tt.Comment = st.Comment

WHEN NOT MATCHED BY TARGET THEN --* Insert from source to target.
    INSERT (Id, SSN, FirstName, MiddleName, LastName, Gender, DateOfBirth, Email, Phone, Comment)
    VALUES (st.Id, st.SSN, st.FirstName, st.MiddleName, st.LastName, st.Gender, st.DateOfBirth, st.Email, st.Phone, st.Comment)
;

SELECT @@ROWCOUNT;

SET IDENTITY_INSERT [dbo].[TargetTable] OFF
GO

到目前为止,我试过了:

  • 在“自定义查询”的“查找”组件的“高级”窗格中,我尝试使用上述查询,但偶然发现了“SourceTable”。不知道如何在“自定义查询”中获取输入记录集 (不知道是否可能)。

任何帮助和/或指针都会很棒。

2 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,只需使用执行SQL任务执行Merge语句。然后你不需要任何查找。我们对仓库的最终装载使用相同的策略。

答案 1 :(得分:0)

是的,您可以使用MERGE,但需要将数据加载到临时表中。这是' ELT'方法 - 提取,加载(进入数据库),转换,而不是“ETL”。方法 - 提取,转换(在包中),加载(到数据库中)

如果您不介意使用SQL脚本,我通常会发现ELT方法更快,更易于维护。当然,单个批量更新比SSIS中发生的逐行更新更快