我编写了T-SQL MERGE
查询,以将分段数据合并到数据仓库中(您可以在底部找到它)。
如果我取消注释OUTPUT
语句,则会出现标题中提到的错误。
但是,如果我不包括它,那么一切都会很好,并且MERGE
成功。
我知道MERGE
子句存在一些问题,但是与合并类型有关的问题更多。
我检查了以下答案:[https://dba.stackexchange.com/questions/140880/why-does-this-merge-statement-cause-the-session-to-be-killed],但是在我的执行计划中,我找不到确切的索引插入,然后是索引合并。
相反,我看到的是the following execution plan
代码是在附加到SQL Server 2012(SP4)实例的数据库上开发的
我非常感谢对此问题进行了很好的解释,最好是参考执行计划中的步骤。
谢谢。
declare @changes table (chgType varchar(50),Id varchar(18))
begin try
set xact_abort on
begin tran
;with TargetUserLogHsh as (select
hsh =hashbytes('md5',concat(coalesce([AccountName],'')
,coalesce([TaxNumber],'')))
,LastLoginCast = coalesce(CONVERT(datetime,LastLogin,103),getdate())
,* from
dw.table1)
,SourceUserLogHsh as (select
hsh =hashbytes('md5',concat(coalesce([AccountName],'')
,coalesce([TaxNumber],'')))
,LastLoginCast = coalesce(CONVERT(datetime,LastLogin,103),getdate())
,* from
sta.table1)
merge TargetUserLogHsh target
using SourceUserLogHsh source
on target.ContactId = source.ContactId and target.Lastlogincast >= source.LastLoginCast
when not matched then insert (
[AccountName]
,[TaxNumber]
,[LastLogin]
)
values (
source.[AccountName]
,source.[TaxNumber]
,source.[LastLogin]
)
when matched and target.lastlogincast = source.lastlogincast
and target.hsh != source.hsh then
update
set
[AccountName] = source.[AccountName]
,[TaxNumber] = source.[TaxNumber]
,[LastLogin] = source.[LastLogin]
output $action,inserted.contactid into @changes
;
commit tran
end try
begin catch
if @@TRANCOUNT > 0 rollback tran
select ERROR_MESSAGE()
end catch