Я написал запрос T-SQL MERGE
для объединения промежуточных данных в хранилище данных (вы можете найти его внизу).
Если я раскомментирую оператор OUTPUT
, я получу ошибку, упомянутую вназвание.Однако, если я не включу его, все будет отлично работать и MERGE
будет успешным.
Я знаю, что есть некоторые проблемы, связанные с предложением MERGE
, но есть и другие, связанные с типом слияния.
Я проверил следующий ответ: [https://dba.stackexchange.com/questions/140880/why-does-this-merge-statement-cause-the-session-to-be-killed], однако в моем плане выполнения я не могу найти точно вставку индекса с последующим слиянием индекса.
Скорее, я вижу следующий план выполнения
Код был разработан для базы данных, подключенной к экземпляру 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