TSQL пункт OUTPUT в MERGE заявлении поднять Msg 596 «Невозможно продолжить выполнение, поскольку сеанс находится в состоянии убить»

голоса
1

Я написал T-SQL MERGEзапрос , чтобы объединить данные поэтапности в хранилище данных (вы можете найти его в нижней части ).

Если я раскомментировать OUTPUTзаявление я получаю сообщение об ошибке , указанной в заголовке. Однако, если я не включить его, все работает прекрасно и MERGEуспешно.

Я знаю , что есть какой - то вопрос связан с MERGEпунктом, однако более связаны с типом слияния.

Я проверил следующий ответ: [ https://dba.stackexchange.com/questions/140880/why-does-this-merge-statement-cause-the-session-to-be-killed] , однако в моем плане исполнения I не может найти именно указательный вставку с последующим индексом слияния.

Скорее всего , что я вижу следующий план выполнения

Кодекс был разработан на базе прилагается к 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
Задан 27/11/2018 в 15:03
источник пользователем
На других языках...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more