0

これはおそらくおなじみの問題ですが、検索で答えが見つかりませんでした。すべての非キー列で COALESCE を含むソリューション (以下に示す) があります。動的 TSQL ルーチンがあるかどうか、またはすべての列に明示的に名前を付けることを含まないクエリを公式化する別の方法があるかどうか疑問に思っています。

同じフィールド名とタイプを持つ 2 つのテーブル "targetTable" と "deltaTable" があります。どちらも一意のキー「id」を持っています。

Deltatable には、targetTable の対応する行で変更されたデータがあります。値が変更されていない列はすべて null です。deltaTable の対応する行に null 以外の値を持つ targetTable の列を更新したいと考えています。DetlaTable.id は TargetTable.id に存在することが保証されており、フィールドを NULL に更新したくありません。

私は SQL Server 2005 を使用しています (merge ステートメントがありませんが、それが役立つとは知りません)。

したがって、targetTable 行が次のように見える場合

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

deltaTable 行は次のようになります

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

targetTable を次のように更新したい

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

私が今改善したいのは、次のとおりです。

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
4

1 に答える 1

0

それが素晴らしいアイデアかどうかはわかりませんが、本当にやりたい場合は、次のようにすることができます。

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
于 2012-09-04T20:36:59.310 に答える