Предложение TSQL OUTPUT в операторе MERGE вызывает сообщение 596 «Невозможно продолжить выполнение, поскольку сеанс находится в состоянии уничтожения» - PullRequest
0 голосов
/ 27 ноября 2018

Я написал запрос 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
...