Пример таблицы для обсуждения
create table t1 (id int identity primary key, other int);
insert t1 select 2;
Этот TSQL делает окончательный выбор в конце, что в итоге приводит к ExecuteNonQuery
set nocount on
declare @tmp table (action sysname)
;
with new(id,other) as (select 1,4)
merge top(1)
into t1
using new
on t1.id = new.id
when matched then update set other = new.id
when not matched then insert values (other)
output $action
into @tmp
;
set nocount off
select action from @tmp
Это хорошо работает для TOP (1), так как он создает только одну строку в @tmp, но в приведенном ниже примере показано, что происходит при наличии нескольких записей, продолжая с вышеупомянутого
set nocount on
declare @tmp table (action sysname)
;
merge
into t1
using (values(1,4),(2,5)) new(id,other)
on t1.id = new.id
when matched then update set other = new.id
when not matched then insert values (other)
output $action
into @tmp
;
set nocount off
select action from @tmp
Выход:
action
======
UPDATE
INSERT
- Влияет ли дополнительная переменная временной таблицы и инструкция SELECT для SP на производительность?
Это было бы незначительным, вы можете игнорировать его.
- Должен ли я "обернуть" 2 в транзакции (мое приложение является многопоточным)?
Нет. Вставка в @tmp является атомарной, а выбор происходит из временной таблицы, специфичной для сессии (ничто не может помешать ей)