Sql server SQL server中的OUTPUT$action,为特定列的更新行输出加上大小写
我正在对我的数据仓库进行合并升级。我不需要保存这个特定对象的历史记录,所以我使用的是一种类型,我在慢慢改变维度。我正在使用Sql server SQL server中的OUTPUT$action,为特定列的更新行输出加上大小写,sql-server,output,upsert,sql-merge,Sql Server,Output,Upsert,Sql Merge,我正在对我的数据仓库进行合并升级。我不需要保存这个特定对象的历史记录,所以我使用的是一种类型,我在慢慢改变维度。我正在使用OUTPUT$action,以便跟踪每天发生的更新和插入次数 我的目标是跳过更新特定列(特别是年龄)时的日志记录步骤,因为我希望每个过生日的人都能更改年龄(出于隐私考虑,我不能在对象中包含生日)。不希望在日志记录中计算这些更新 到目前为止,我的日志记录是: OUTPUT $action, CASE $action WHEN 'UPDATE' THEN 'Found
OUTPUT$action
,以便跟踪每天发生的更新和插入次数
我的目标是跳过更新特定列(特别是年龄)时的日志记录步骤,因为我希望每个过生日的人都能更改年龄(出于隐私考虑,我不能在对象中包含生日)。不希望在日志记录中计算这些更新
到目前为止,我的日志记录是:
OUTPUT $action,
CASE $action
WHEN 'UPDATE' THEN 'Found matching key: updated existing record'
WHEN 'INSERT' THEN 'No matching key: inserted new record'
END
INTO @SummaryOfChanges(Change, Reason)
我想添加这样的逻辑:如果列age
是更新的列,那么跳过日志记录步骤
与$action
中插入和删除的部分不同,我看不到回调更新行信息的方法。我在OUTPUT
步骤中尝试了各种CASE
语句,但不知道如何检查age
是否是行合并期间更新的列之一。在OUTPUT
子句中,我似乎无法检查源和目标age
是否匹配
有什么想法吗?谢谢大家! 您可以使用。您可以在插入时执行类似于
CASE.age!=已删除。年龄然后为1,否则为0结束
。您可能需要处理空值。谢谢Steven-我找到了用于插入和删除的命令,但不用于更新,因为我没有插入或删除这些行。您知道是否有一个更新的
特殊表格吗?更新
会删除一个旧的行,然后插入一个新行,因此,您应该查看deleted
和inserted
特殊表。我认为merge命令的UPDATE
部分会更新现有记录,而不是删除或插入记录。更新行的自动递增主键不会更改。它看起来确实是一个标准的更新。可能这些信息没有记录在特殊表格中?谢谢你,弗拉基米尔,谢谢你,史蒂文!你们太棒了!完全正确。因为我的自动递增键没有更改,而且语法看起来像是直接更新,所以我错误地认为这些更改没有记录到UPDATED
或DELETED
。现在我看到他们了!首先,我检查ISNULL(inserted.age,)=ISNULL(deleted.age,)时的大小写,然后检查标准日志,否则NULL
。在插入日志时,我只需检查原因不为NULL的。工作起来很有魅力。