powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Insert(instead) Trigger and merge with output
9 сообщений из 9, страница 1 из 1
Insert(instead) Trigger and merge with output
    #39777736
ther
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
запрос
Код: 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
Insert(instead) Trigger and merge with output
    #39777740
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ther,

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

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

Бывало, для того, чтобы надёжно получить IDENTITY вставленных записей независимо от наличия
триггеров и прочих деталей, я создавал в таблице специальное поле, которое заполнял определённым
значением в INSERTе, а после INSERTа находил все появившиеся записи по известному мне значению
в этом спецполе. Очень удобно для этого использовать тип uniqueidentifier. Перед INSERTом присваиваем значение
переменной функцией NEWID(), в INSERTе вставляем значение этой переменной, а после - достаём IDENTITY
SELECTом по условию равенства значения поля значению переменной.
Сейчас, возможно, на меня обрушатся с упрёками - дескать, зачем тогда вообще IDENTITY,
если ключом можно сделать поле типа uniqueidentifier (а сейчас ещё и SEQUENCE имеется!)?
...
Рейтинг: 0 / 0
Insert(instead) Trigger and merge with output
    #39777803
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Insert(instead) Trigger and merge with output
    #39777817
ther
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
понял, пасиб
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Insert(instead) Trigger and merge with output
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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