代码之家  ›  专栏  ›  技术社区  ›  Darknight

有选择地更新字段

  •  1
  • Darknight  · 技术社区  · 16 年前

    我有一个用新数据更新现有记录所需的存储过程,但是它不能“重写”任何现有数据。

    例如,我们可能有三个字段:

     FirstName | LastName | PhoneNumber
    

    调用上面的“tablex”。

    在一个非常简单的更新中,这可能看起来像这样:

     Update TableX
     set    FirstName = [TableY.FirstName]
           ,LastName = [TableY.LastName]
           ,PhoneNumber = [TableY.PhoneNumer]
     etc.....
    

    但是,我要求每个列只有在它为空时才更新(从tabley)。

    4 回复  |  直到 16 年前
        1
  •  4
  •   Michael Pakhantsov    16 年前
    Update TableX
    set    FirstName = ISNULL(FirstName, [TableY.FirstName])
          ,LastName = ISNULL(LastNastName, [TableY.LastName])
          ,PhoneNumber = ISNULL(PhoneNumber, [TableY.PhoneNumer])
    

    …

    如果“空”不是空的,那么

    Update TableX
    set    FirstName = case FirstName when "" then [TableY.FirstName] else FirstName end
          ,LastName = case LastName when "" then [TableY.LastName]) else LastName end
          ,PhoneNumber = case PhoneNumber when "" then [TableY.PhoneNumer] else PhoneNumber end
    
        2
  •  1
  •   anishMarokey FIre Panda    16 年前

    你需要使用 when then 这样做。

    UPDATE [AdventureWorks_DB].[dbo].[activities]
    SET  [FirstName ] = case  when FirstName  is  null then 'pass First Name'
                         else  [FirstName ]
    end,
    LastName  = case  when LastName  is  null then 'pass Last Name'
              else  LastName 
    end,
    PhoneNumber = case  when PhoneNumber is  null then 'pass PhoneNumber'
            else  PhoneNumber
    end
    
        3
  •  0
  •   Ralf de Kleine    16 年前
    update
        TableX
    set 
    FirstName = (case when FirstName = null then  @firstname else FirstName end)
    where 
    Id=1
    
        4
  •  0
  •   onedaywhen    16 年前

    因为更新在逻辑上是一个删除,那么使用 COALESCE 模式,不过最好不要检查所有空参数值,例如

    UPDATE TableX
       SET FirstName = COALESCE(@FirstName, FirstName), 
           LastName = COALESCE(@LastName, LastName), 
           PhoneNumber = COALESCE(@PhoneNumber, PhoneNumer)
     WHERE COALESCE(@FirstName, @LastName, @PhoneNumber) IS NOT NULL
           AND person_X_ID = @person_X_ID;
    
    推荐文章