2010-08-13 123 views
1

我有一個存儲過程,需要使用新數據更新現有記錄,但是它不能「覆蓋」任何現有數據。有選擇地更新字段

例如,我們可具有三個字段:

FirstName | LastName | PhoneNumber 

呼叫上述 'TableX的'。

在非常簡單的更新,這可能是這個樣子:

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

但是我要求每列僅更新(從TableY),如果它是空的。

回答

4
Update TableX 
set FirstName = ISNULL(FirstName, [TableY.FirstName]) 
     ,LastName = ISNULL(LastNastName, [TableY.LastName]) 
     ,PhoneNumber = ISNULL(PhoneNumber, [TableY.PhoneNumer]) 

...

如果 '空' 並不意味着NULL,則

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 
1

您需要使用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 
+0

確實,我只是在制定一個代碼示例 – 2010-08-13 11:25:29

0
update 
    TableX 
set 
FirstName = (case when FirstName = null then @firstname else FirstName end) 
where 
Id=1 
0

因爲更新在邏輯上是刪除,然後插入有一個在不傷害使用COALESCE模式,儘管可能不是檢查所有NULL參數值,例如

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;