如何解决在更新查询中查找所有更改的值
我有一个查询从源表更新目标表,但前提是目标表中的字段为空或包含值“1899-12-30”。
Targettable 和 sourcetable 仅由 nvarchar 字段组成。我对这些表的设计没有影响。任何看起来像日期的字符串仍应视为字符串。
UPDATE targettable SET
columnA=IIF(len(t.columnA) = 0 OR t.columnA = '1899-12-30',s.columnA,t.ColumnA),columnB=IIF(len(t.columnB) = 0 OR t.columnB = '1899-12-30',s.columnB,t.columnB),columnC=IIF(len(t.columnC) = 0 OR t.columnC = '1899-12-30',s.columnC,t.columnC)
FROM sourcetable s
LEFT JOIN targettable t
t.ColumnA = '' (空字符串) 所以它更新 s.columnA 包含 'foo'
t.ColumnB = 'something' 所以它不会更新
t.ColumnC = '1899-12-30' 所以它更新 s.columnC 包含'1900-01-01'
现在我想要的是获取改变的值并像这样存储它们
TIME_OF_CHANGE | COLUMNNAME| OLD_VALUE | NEW_VALUE
2021-5-20 14:12 | ColumnA | | foo
2021-5-20 14:12 | ColumnC | 1899-12-30| 1900-01-01
updatequery 就像一个魅力,但我不知道如何转换这些数据,以便将它写成TIME_OF_CHANGE | COLUMNNAME| OLD_VALUE | NEW_VALUE
解决方法
最后我是这样做的:
declare @changeTime as datetime = getdate()
;WITH NEWDATA AS (
SELECT @changeTime AS modified,'NEW' AS status,t.id AS primarykey,columnA=IIF(len(t.columnA) = 0 OR t.columnA = '1899-12-30',s.columnA,t.ColumnA),columnB=IIF(len(t.columnB) = 0 OR t.columnB = '1899-12-30',s.columnB,t.columnB),columnC=IIF(len(t.columnC) = 0 OR t.columnC = '1899-12-30',s.columnC,t.columnC)
FROM sourcetable s
INNER JOIN targettable t
WHERE t.columnA=IIF(len(t.columnA) = 0 OR t.columnA = '1899-12-30',t.ColumnA)
OR t.columnB=IIF(len(t.columnB) = 0 OR t.columnB = '1899-12-30',t.columnB)
OR t.columnC=IIF(len(t.columnC) = 0 OR t.columnC = '1899-12-30',t.columnC)
)
INSERT INTO tbl_CHANGES
SELECT * FROM NEWDATA
INSERT INTO tbl_CHANGES
SELECT @changeTime AS modified,'OLD' AS status,*
FROM targettable t
WHERE t.primarykey in (SELECT primarykey FROM tbl_CHANGES WHERE modified = @changeTime)
UPDATE targettable SET
columnA=IIF(len(t.columnA) = 0 OR t.columnA = '1899-12-30',t.columnC)
FROM sourcetable s
LEFT JOIN targettable t
它存储了每条已更改记录的“旧”版本和“新”版本。 它不像最初设想的解决方案那么好,但它确实达到了能够看到更改内容的目标。 当然,所有这些都包含在单个事务中。把它作为最好的或最聪明的(这不是生产)提出来,但有人可能会偶然发现这个问题并喜欢一个答案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。