Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Insert(instead) Trigger and merge with output  [new]
ther
Member

Откуда:
Сообщений: 814
запрос
    MERGE INTO CS_ControlSystemList AS Target  
    USING( 
      select CS_ID, IIF(ISNUMERIC(CSL_ID)=1,CSL_ID,null) CSL_ID, CSL_Type, CSL_PersonID, CSL_Note 
      from #persons
    ) AS Source(CS_ID, CSL_ID, CSL_Type, CSL_PersonID, CSL_Note)
    ON Target.CSL_ID = Source.CSL_ID 
    WHEN MATCHED THEN 
      UPDATE 
      SET 
        CSL_PersonID  = Source.CSL_PersonID,
        CSL_Note      = Source.CSL_Note
    WHEN NOT MATCHED BY TARGET THEN
      INSERT(CSL_ControlSystemID,CSL_Type,CSL_PersonID,CSL_Note)  
      VALUES(CS_ID,CSL_Type,CSL_PersonID,CSL_Note)
    OUTPUT 
      $action,                --INSERT/UPDATE
      inserted.CSL_ControlSystemID, --ссыль на систему контроля          
      inserted.csl_PersonID,  --пупсик
      inserted.csl_id,       <<<<<<<<<<<<<<  вернуло 0
      inserted.csl_Note       --заметка позиции сотрудника
      into @CS_MergeControlSystemList;

csl_id - первичный, автоинкрементный

и есть на таблицу CS_ControlSystemList два триггера After и Instead. Так вот, когда я отключаю триггер Instead, inserted.csl_id возвращает идешку, в противном случае 0.
Как это побороть?
==============
начал извращаться и сделал select * from inserted в триггере After, но не могу загнать этот результат в темповую таблицу. Это возможно?
22 фев 19, 09:42    [21817037]     Ответить | Цитировать Сообщить модератору
 Re: Insert(instead) Trigger and merge with output  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
ther,

при наличии istead of триггера получить значения identity в output нельзя нигде.
22 фев 19, 09:54    [21817046]     Ответить | Цитировать Сообщить модератору
 Re: Insert(instead) Trigger and merge with output  [new]
ther
Member

Откуда:
Сообщений: 814
это я уже понял, а как выйти из ситуации?
к примеру, как словить select из триггера after?
22 фев 19, 10:26    [21817067]     Ответить | Цитировать Сообщить модератору
 Re: Insert(instead) Trigger and merge with output  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
ther
это я уже понял, а как выйти из ситуации?
к примеру, как словить select из триггера after?

где словить? вне триггеров? Пишите в таблицу, глобальную временную. Нафига всё это не ясно
22 фев 19, 10:28    [21817070]     Ответить | Цитировать Сообщить модератору
 Re: Insert(instead) Trigger and merge with output  [new]
ther
Member

Откуда:
Сообщений: 814
это надо для того, что бы получить идешки новых записей после мерджа
22 фев 19, 10:34    [21817076]     Ответить | Цитировать Сообщить модератору
 Re: Insert(instead) Trigger and merge with output  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
ther
это надо для того, что бы получить идешки новых записей после мерджа

зачем вам вообще instead ?
22 фев 19, 10:49    [21817090]     Ответить | Цитировать Сообщить модератору
 Re: Insert(instead) Trigger and merge with output  [new]
iap
Member

Откуда: Москва
Сообщений: 46954
Вообще, в вопросе получения IDENTITY вставленных записей у Microsoft творится форменный бардак!
Вот, например, когда-то мы тут обсуждали (таких обсуждений, вообще-то, на форуме десятки):

Ситуация с @@IDENTITY, помогите отловить

Бывало, для того, чтобы надёжно получить IDENTITY вставленных записей независимо от наличия
триггеров и прочих деталей, я создавал в таблице специальное поле, которое заполнял определённым
значением в INSERTе, а после INSERTа находил все появившиеся записи по известному мне значению
в этом спецполе. Очень удобно для этого использовать тип uniqueidentifier. Перед INSERTом присваиваем значение
переменной функцией NEWID(), в INSERTе вставляем значение этой переменной, а после - достаём IDENTITY
SELECTом по условию равенства значения поля значению переменной.
Сейчас, возможно, на меня обрушатся с упрёками - дескать, зачем тогда вообще IDENTITY,
если ключом можно сделать поле типа uniqueidentifier (а сейчас ещё и SEQUENCE имеется!)?
22 фев 19, 11:31    [21817127]     Ответить | Цитировать Сообщить модератору
 Re: Insert(instead) Trigger and merge with output  [new]
invm
Member

Откуда: Москва
Сообщений: 9128
ther,

+
use tempdb;
go

create table dbo.t(id int identity primary key, v int);
go

create trigger dbo.ii_t
on dbo.t
instead of insert
as
begin
 set nocount on;

 if not exists(select 1 from inserted)
  return;

 if col_length('tempdb..#t', 'id') is not null
  insert into dbo.t
   (v)
  output
   inserted.id into #t (id)
  select
   v
  from
   inserted;
 else
  insert into dbo.t
   (v)
  select
   v
  from
   inserted;

end;
go

insert into dbo.t
 (v)
values
 (1), (2);

create table #t (id int);

insert into dbo.t
 (v)
values
 (3), (4);

select * from dbo.t;
select * from #t;
go

drop table #t, dbo.t;
go
Только имей в виду: получите на каждую сессию свой план триггера, плюс возможны его рекомпиляции.
22 фев 19, 11:35    [21817130]     Ответить | Цитировать Сообщить модератору
 Re: Insert(instead) Trigger and merge with output  [new]
ther
Member

Откуда:
Сообщений: 814
понял, пасиб
22 фев 19, 11:46    [21817152]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить