2016-06-23 101 views
1

我有一个请求来修改/插入基于值的产品中的新数据。
目前我正在使用SSIS将数据插入到堆表中,然后我需要根据状态将记录移动到表中。
我有3个状态添加,更新,删除。
如何根据下面提到的状态编写插入/更新查询?基于值插入更新

这里是逻辑:

  • 如果状态列包含添加 - 我需要在产品表中插入这些记录
  • 如果状态列包含更新 - 我需要更新数据,已经存在于产品表
  • 如果状态列包含删除 - 我需要的产品设定位有效列数据停用0

回答

1

两个选择:

  1. 编写更新语句以更新任何现有行,并使用插入语句进行跟踪,以插入新行。这将在两个操作中运行,但将允许您完全独立地维护逻辑。
  2. 使用merge运算符可以在单个操作中执行多个操作。

在存储过程中包装1或2,然后简单地从SSIS调用该过程。就个人而言,我使用示例1的一个版本,其中插入/更新代码是独立包装的过程,upsert过程只需按照正确的顺序调用。这比示例2效率稍低,但我发现它是一种更灵活和可维护的模式(尤其是在与table-valued parameters配对时)。

实施例1:

create procedure dbo.usp_MyTable_Upsert 
as 
begin; 
    update <Target> 
     set ... 
    from <Source> 
    join <Target> 
     on ...; 

    insert into <Target>(...) 
    select ... 
    from <Source> 
    where not exists (
       select 1 
       from <Target> 
       where ... 
     ); 
end; 

实施例2:

create procedure dbo.usp_MyTable_Upsert 
as 
begin; 
    merge <Target> 
    using <Source> 
     on ... 
    when matched then 
     update 
      set ... 
    when not matched by target then 
     insert ... 
    when not matched by source then 
     delete; 
end; 
+0

你好。感谢您的反馈意见。请提供一些例子以示热心? – Key

+0

@SashaStecovych我已经添加了两个使用伪代码的示例,旨在传达您需要执行的操作的“形状”。我在'merge'上提供的链接提供了几个使用AdventureWorks2012数据库的实例。 – Kittoes0124

+0

我的建议是使用合并。它更灵活。但是,与IF .. ELSE一样,*不保证是原子操作。 –