2016-10-24 2 views
0

다음을 수행하는 저장 프로 시저가 있습니다.MS SQL - 조건부 UPDATE 반환 결과

채워진 목표 테이블 데이터는 여러 유사한 소스 테이블과 일치하는지 (이름 및 주소 데이터를 기반으로) 점검됩니다. 첫 번째 테이블에서 일치하는 항목이 발견되면 일치하는 원본 테이블을 식별하는 플래그로 대상을 업데이트합니다. 그러나 일치하는 항목을 찾지 못하면 일치하는 항목이 발견되거나 일치하지 않을 때까지 다음 원본 테이블과 다음 항목을 조사해야합니다.

UPDATE 문에서 대상 테이블을 업데이트했는지 여부를 쿼리 할 수있는 일종의 반환 값을 제공하는 쉬운 방법이 있습니까? 후속 소스 테이블을 불필요하게 검사하는 것을 건너 뛸 수 있도록이 반환 값을 사용하고 싶습니다.

그렇지 않으면 조건부 UPDATE를 수행 한 다음 별도의 쿼리를 수행하여 UPDATE가 실제로 플래그를 업데이트했는지 확인해야합니까?

+0

조건이 필요 없으며 다른 업데이트를 실행하기 만하면됩니다. ID를 발견하면 테이블을 업데이트하여 아무 일도 일어나지 않습니다. – PeterRing

답변

0

나는 고든의 영혼을 좋아하지만 실제로 필요하다고 생각하지 않는다.

간단하게 순서대로 업데이트를 실행 등등

UPDATE BASE_TABLE 
SET FLAG='first_table' 
where FLAG IS null AND 
EXIST (SELECT 1 FROM first_table f1 where f1.ID = ID) 

UPDATE BASE_TABLE 
SET FLAG='second_table' 
where FLAG IS null AND 
EXIST (SELECT 1 FROM second_table f2 where f2.ID = ID) 

... 그리고있다. 당신은 모든 행을 조건부로 검사 할 필요가 없다. 그것은 매우 느릴 것이다.

+0

안녕하세요 피터, 나는 당신이 당신의 초기 답장에 대해 무엇을 의미하는지 확신하지 못했지만 나는 당신의 의견을 통해 필드에 가치가 있는지 단순히 확인할 수있었습니다. 감사. – user3411176

+0

Peter, 위와 같은 일련의 업데이트 명령이 수십 가지가 있었는데 리소스가 많이 필요했습니다. 첫 번째 업데이트에서 일치하는 항목을 발견하면 후속 쿼리가 필드를 확인하지 않고 다른 업데이트를 건너 뛰는 다른 방법이 있습니까? – user3411176

+0

FLAG가 null이므로 업데이트가 이미 업데이트 된 행을 건너 뜁니다. 확인하지 않아도됩니다. 당신이해야 할 일은 그들을 저지하는 것뿐입니다. 그래서 기초 : BEGIN TRAN; 최신 정보; COMMIT TRAN – PeterRing

2

아마도 가장 안전한 방법은 OUTPUT clause을 사용하는 것입니다. 그러면 수정 된 행이 새 테이블로 반환됩니다.

테이블을 검사하여 업데이트 된 행이 있는지 확인할 수 있습니다.

OUTPUT 절의 장점 중 하나는 동시에 여러 행을 업데이트 할 수 있다는 것입니다.

+0

두 번째로 나를 이길! –

+0

Crikey! 그 엄청난 즉각적인 반응에 대해 대단히 감사합니다. 내가 제공 한 링크에서 읽습니다. – user3411176

0

업데이트를 try/catch에 넣고 결과를 다른 테이블에 삽입 할 수 있습니다.