2012-09-04 2 views
0

이것은 아마도 익숙한 문제 일 수 있지만 검색에서 답을 찾지 못했습니다. 모든 키가 아닌 열에 COALESCE가 포함 된 솔루션 (아래 참조)이 있습니다. 동적 TSQL 루틴이 있는지 또는 모든 열의 명시적인 명명과 관련이없는 쿼리를 구성하는 다른 방법이 있는지 궁금합니다.대상 테이블의 모든 열을 해당 null이 아닌 소스 필드로 업데이트하십시오.

"targetTable"과 "deltaTable"테이블에는 동일한 필드 이름과 유형이 있습니다. 둘 다 고유 키 "id"를 가지고 있습니다.

Deltatable에는 targetTable의 해당 행에 대해 변경된 데이터가 있습니다. 값이 변경되지 않은 모든 열은 null입니다. deltaTable의 해당 행에 null이 아닌 값이있는 targetTable의 열을 업데이트하려고합니다. DetlaTable.id는 TargetTable.id에 존재한다는 보장이 있으며 필드를 NULL로 업데이트하지 않으려합니다.

SQL Server 2005를 사용하고 있습니다. 병합 명령문이 없으므로 도움이 될 것입니다.

은 그래서 targetTable 행

id | name | dob  | next_appt 
    5 Bill  1-1-2012 | 3-3-2015 

과 같은 경우 내가 targetTable 내가 지금 내가 원하는 것을 가지고 무엇

id | name | dob  | next_appt 
    5 Bill  1-1-2012 | 4-4-2015 

으로 업데이트 할

id | name  | dob  | next_appt 
    5 | NULL  | NULL  | 4-4-2015 

같은 deltaTable 행 보인다 개선 할 내용 :

나는 그것이 좋은 생각,하지만 당신이 정말로 그것을 수행하려는 경우, 당신은 같은 것을 할 수있는 모르겠어요210
UPDATE target 
SET target.colA = COALESCE(delta.colA, target.colA), 
    target.colN = COALESCE(delta.colN, target.colN) 
FROM delta JOIN target on delta.id = target.id 
+0

을, 당신은에 있습니다 업데이트 할 열을 지정하십시오. 당신은 문자열을 만들고 EXEC로 실행할 수 있습니다. 그러나 SQL 주입, 유지 보수가 어려운 코드 및 느린 성능의 가능성을 열어줍니다. 귀하의 쿼리가 그대로 보인다. – LittleBobbyTables

+0

나는 그 쿼리가 괜찮아 보이는 데 동의한다. 동적으로 쿼리를 작성할 수는 있지만 설득력있는 이유가 없다면 고려하지 않을 것입니다. – Narthring

+0

고마워, littlebobbytables 및 narthring, 나는 아마도 GilM의 대답을 받아 들일 것이다. 나는 그것을 테스트 해 본다. 이것은 대단히 선택의 여지가없는 시나리오이다. 우리 부서가 스키마를 제어하지는 않지만 변환해야하는 독점적 인 GUI로 변환을 수행하고 많은 프로젝트를 위해 복사 된 스크립트는 동적 쿼리의 복잡성을 보람있게 만듭니다. –

답변

0

:`UPDATE`와`MERGE` 모두

DECLARE @sql nvarchar(max) 
SET @sql = N'UPDATE target SET 
'; 
SELECT @sql = @sql + N' target.'+QUOTENAME([name]) + ' = COALESCE(delta.' + QUOTENAME([name]) + ', target.' + QUOTENAME([name]) + '), 
' 
FROM sys.columns 
where object_id = object_id('target') AND [name] != 'id' 
order by [column_id] 

SET @sql = STUFF(@sql,LEN(@sql)-2,1,''); -- strip off the last commma 
set @sql = @sql + 
'FROM delta 
JOIN target ON delta.id = target.id' 

EXECUTE sp_executesql @sql 
+0

감사합니다. –

관련 문제