2010-08-13 3 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]) 

...

그런 다음 삽입에 아무런 해가 없다 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; 
1

이렇게하려면 when then을 사용해야합니다. 업데이트가 논리적으로 삭제하기 때문에 '빈'은 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 
+0

정확히 예를 들어 코드 예제를 작성했습니다. –

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

을 의미하지 않는 경우

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 
관련 문제