根据值插入更新

时间:2016-06-23 19:09:33

标签: sql sql-server stored-procedures

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

这是逻辑:

  • 如果“状态”列包含“添加” - 我需要在产品表中插入这些记录
  • 如果“状态”列包含“更新” - 我需要更新“产品表”中已存在的数据
  • 如果“状态”列包含“删除” - 我需要将产品集位“活动列数据”停用为0

1 个答案:

答案 0 :(得分:1)

两种选择:

  1. 编写更新语句以更新任何现有行,并使用将插入新行的insert语句进行跟进。这将在两个操作中运行,但允许您完全独立地维护逻辑。
  2. 使用merge运算符在一次操作中执行多项操作。
  3. 在存储过程中包装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;