2016-10-29 1 views
1

최근에 테이블에 대한 몇 가지 변수 업데이트를 수행해야했지만 병합 성명을 알고 있지만 (이 모든 것을 따라 잡을 필요가 있음에도 불구하고) 다음 문장을 수행하여 선택적으로 테이블을 업데이트하고 이것이 "좋은 생각"인지 또는 내가 알지 못하는 숨겨진 결과가 있는지 확인하고 싶습니다.case 문을 기반으로하는 열의 SQL 부분 업데이트?

제 경우에는 기본 키를 테이블에 전달하지만, 전달 된 매개 변수가 null인지 여부에 따라 열을 업데이트합니다. 강제 업데이트 (상태 등)를 확실히해야하는 경우 분명히.) 다음은이 유형의 구조 .. 그냥 위의 몇 가지 생각 후

create procedure sp_myprocedure 
as 
    @id      bigint, 
    @field1     int = null, 
    @field2     varchar(255) = null, 
    @field3     char(1) = null 
begin 

    update my_table 
    set 
     field1 = case when @field1 is not null then @field1 else field1 end, 
     field2 = case when @field2 is not null then @field2 else field2 end, 
     field3 = case when @field3 is not null then @field3 else field3 end, 
    where 
     id = @id 

end 

또는 시나리오의 MERGE 문을 추구하는 것이 가장 좋습니다 "/ THEN이 경우"복수를 가진 저장하는 것입니다 .. 열을 업데이트 위처럼? 사전에

많은 감사,

답변

1

이 깨끗한 방식으로 작성 될 수 있지만이 괜찮습니다.

update my_table 
    set 
     field1 = coalesce (@field1,field1) 
    ,field2 = coalesce (@field2,field2) 
    ,field3 = coalesce (@field3,field3) 
    where 
     id = @id and coalesce(@field1,@field2,@field3) is not null 

또한 래퍼 블록 문이 여기에 관련이 없습니다

if coalesce(@field1,@field2,@field3) is not null 
begin 

    update my_table 
    set 
     field1 = coalesce (@field1,field1) 
    ,field2 = coalesce (@field2,field2) 
    ,field3 = coalesce (@field3,field3) 
    where 
     id = @id 

end 

병합 할 coalesce(@field1,@field2,@field3) is not null를 이동할 수 있습니다. INSERT, UPDATE에 또는 소스/목표 테이블에서 동일한 병합 키 레코드의 존재/존재에 기록 염기를 삭제하면 MERGE 함께
결정이다.
귀하의 경우 항상 업데이트입니다.

+0

건배, 대안을 가져 주셔서 감사합니다. 그래서 합병은보다 효율적으로 보일까요? 또는 합체 기능이 더 "표준"입니까? 나는 양쪽 모두 이해의 관점에서 꽤 잘 읽었다 고 생각하지만 위의 방법 중 하나가 가능하다면 더 스탠드/퍼포먼스인지 여부를 알고 싶었습니까? –

+0

옵션 2는 필요가 없으면 update 문을 실행하지 않기 때문에 미리 설정되어 있습니다. –

+0

@onedaywhen, 조건부 업데이트 기능이 함께 제공됩니까?Merge는이 유스 케이스에서 UPDATE에 비해 어떤 종류의 이점 (기능/성능/구문)을 가지고 있습니까? 아니, 아니. –

1
 create procedure sp_myprocedure 

     @id      bigint, 
     @field1     int = null, 
     @field2     varchar(255) = null, 
     @field3     char(1) = null 
     as 
     begin 
     IF coalesce(@field1,@field2,@field3) is not null 
      update dbo.my_table 
      set 
      field1 = coalesce (@field1,field1), 
      field2 = coalesce (@field2,field2), 
      field3 = coalesce (@field3,field3) 
      where id = @id 
     END 
1

@Dudu Markovitz에 의해 대답에 응답 :

MERGE 문이 여기에 관련이 없습니다.

내가 동의하지 않는다면, 여기서는 MERGE이 전적으로 관련이 있다고 생각합니다. 단일 테이블 반환 매개 변수이 있다면 (논쟁의 여지로가 있어야한다, 물론

MERGE my_table T 
    USING (VALUES (@id, @field1, @field2, @field3)) 
     AS S (id, field1, field2, field3) 
     ON T.id = S.id 
WHEN MATCHED THEN 
    UPDATE 
     SET field1 = COALESCE(S.field1, T.field1), 
      field2 = COALESCE(S.field2, T.field2), 
      field3 = COALESCE(S.field3, T.field3); 

:

아이디어는 목표 테이블을 업데이트 할 수와 매개 변수 값을 사용하여 소스 테이블 식을 만드는 것입니다) MERGE의 관련성은 더욱 분명합니다.

+0

간단한 UPDATE 문보다 장점이 있으므로 수행 할 수 있습니다. CTAS, DROP TABLE 및 RENAME TABLE을 사용하여 동일한 결과를 얻을 수 있다고 주장 할 수 있습니다. –

+0

수정 제안. –