0

这可能是一个熟悉的问题,但我没有在搜索中找到答案。我确实有一个解决方案(如下所示),它在每个非键列上都涉及 COALESCE,我想知道是否有一个动态 TSQL 例程,或者可能是一种不涉及显式命名所有列的不同查询方式。

我有两个表,“targetTable”和“deltaTable”,它们具有相同的字段名称和类型。两者都有一个唯一的键“id”。

Deltatable 的数据已针对 targetTable 中的相应行进行了更改。值未更改的任何列都是空的。我想更新在 deltaTable 的相应行中具有非空值的 targetTable 中的列。DetlaTable.id 保证存在于 TargetTable.id 中,我永远不想将字段更新为 NULL。

我正在使用 SQL Server 2005(它没有合并语句,我不知道它会有所帮助)。

所以如果一个 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 回答