Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Insert(instead) Trigger and merge with output / 9 сообщений из 9, страница 1 из 1
22.02.2019, 09:42
    #39777736
ther
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert(instead) Trigger and merge with output
запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    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, но не могу загнать этот результат в темповую таблицу. Это возможно?
...
Рейтинг: 0 / 0
22.02.2019, 09:54
    #39777740
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert(instead) Trigger and merge with output
ther,

при наличии istead of триггера получить значения identity в output нельзя нигде.
...
Рейтинг: 0 / 0
22.02.2019, 10:26
    #39777755
ther
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert(instead) Trigger and merge with output
это я уже понял, а как выйти из ситуации?
к примеру, как словить select из триггера after?
...
Рейтинг: 0 / 0
22.02.2019, 10:28
    #39777757
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert(instead) Trigger and merge with output
therэто я уже понял, а как выйти из ситуации?
к примеру, как словить select из триггера after?
где словить? вне триггеров? Пишите в таблицу, глобальную временную. Нафига всё это не ясно
...
Рейтинг: 0 / 0
22.02.2019, 10:34
    #39777760
ther
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert(instead) Trigger and merge with output
это надо для того, что бы получить идешки новых записей после мерджа
...
Рейтинг: 0 / 0
22.02.2019, 10:49
    #39777772
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert(instead) Trigger and merge with output
therэто надо для того, что бы получить идешки новых записей после мерджа
зачем вам вообще instead ?
...
Рейтинг: 0 / 0
22.02.2019, 11:31
    #39777800
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert(instead) Trigger and merge with output
Вообще, в вопросе получения IDENTITY вставленных записей у Microsoft творится форменный бардак!
Вот, например, когда-то мы тут обсуждали (таких обсуждений, вообще-то, на форуме десятки):

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

Бывало, для того, чтобы надёжно получить IDENTITY вставленных записей независимо от наличия
триггеров и прочих деталей, я создавал в таблице специальное поле, которое заполнял определённым
значением в INSERTе, а после INSERTа находил все появившиеся записи по известному мне значению
в этом спецполе. Очень удобно для этого использовать тип uniqueidentifier. Перед INSERTом присваиваем значение
переменной функцией NEWID(), в INSERTе вставляем значение этой переменной, а после - достаём IDENTITY
SELECTом по условию равенства значения поля значению переменной.
Сейчас, возможно, на меня обрушатся с упрёками - дескать, зачем тогда вообще IDENTITY,
если ключом можно сделать поле типа uniqueidentifier (а сейчас ещё и SEQUENCE имеется!)?
...
Рейтинг: 0 / 0
22.02.2019, 11:35
    #39777803
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert(instead) Trigger and merge with output
ther,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
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

Только имей в виду: получите на каждую сессию свой план триггера, плюс возможны его рекомпиляции.
...
Рейтинг: 0 / 0
22.02.2019, 11:46
    #39777817
ther
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert(instead) Trigger and merge with output
понял, пасиб
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Insert(instead) Trigger and merge with output / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]