Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Есть ли в MERGE способ выдать OUTPUT, если не указан WHEN MATCHED?  [new]
_Промешан_
Member

Откуда:
Сообщений: 970
Ситуация.
Таргет - нормализованная таблица с названиями и идентификаторами
Сорс - куча данных с названиями, но без идентификаторов.

Задача.
1. Нужно вставить из Сорса дистинкт значения, которых нет в таблице.
2. Нужно всей куче Сорса "достать" идентификаторы.


create table #t (id int, data varchar(100));

insert #t (id, data) values (0, 'qwe'),(1,'asd'),(2,'zxc');


;MERGE #t AS target
    USING (SELECT id,data from (values (4,'qwe'),(3,'trt'))a(id,data)) as source (id,data)
    ON (target.data = source.data)
    WHEN NOT MATCHED  THEN
      INSERT (id,data)
      VALUES (source.id,source.data)
    output inserted.*;

drop table #t;

В таком случае будет аутпут только вставок. Чтобы весь сорс был в аутпут, надо ставить WHEN MATCHED и что то апдейтить. Но это лишняя операция.
21 июн 16, 19:08    [19320182]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли в MERGE способ выдать OUTPUT, если не указан WHEN MATCHED?  [new]
_Промешан_
Member

Откуда:
Сообщений: 970
Можно сделать конечно так.
create table #t (id int, data varchar(100))
insert #t (id, data) values (0, 'qwe'),(1,'asd'),(2,'zxc')

SELECT id,data into #r  from (values (4,'qwe'),(3,'trt'))a(id,data)
    where exists(select 1 from #t where data=a.data)
  

insert into #t output inserted.* into #r
  SELECT id,data from (values (4,'qwe'),(3,'trt'))a(id,data)
    where not exists(select 1 from #t where data=a.data)

select * from #r

drop table #t
drop table #r

Но уж больно монстряво, когда есть мерж.
21 июн 16, 19:13    [19320193]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли в MERGE способ выдать OUTPUT, если не указан WHEN MATCHED?  [new]
i-i
Guest
Obijavlaem peremennuu, naprimer @i int i v WHEN MATCHED ee updatim
24 июн 16, 22:59    [19334025]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли в MERGE способ выдать OUTPUT, если не указан WHEN MATCHED?  [new]
0-0
Guest
_Промешан_,

?

declare @i int = 1

create table #t (id int, data varchar(100));

insert #t (id, data) values (0, 'qwe'),(1,'asd'),(2,'zxc');


;MERGE #t AS target
    USING (SELECT id,data from (values (4,'qwe'),(3,'trt'))a(id,data)) as source (id,data)
    ON (target.data = source.data)
    WHEN NOT MATCHED  THEN
      INSERT (id,data)
      VALUES (source.id,source.data)
	when matched then 
	 update 
	 set 
		@i = 1
	output inserted.*;

drop table #t;
28 июн 16, 11:18    [19344084]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли в MERGE способ выдать OUTPUT, если не указан WHEN MATCHED?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4807
declare @i int = 1

create table #t (id int, data varchar(100));

insert #t (id, data) values (0, 'qwe'),(1,'asd'),(2,'zxc');

DECLARE @t_output TABLE (id int, data varchar(100));
;

INSERT INTO @t_output 
SELECT * FROM 
(
MERGE #t AS target
    USING (SELECT id,data from (values (4,'qwe'),(3,'trt'))a(id,data)) as source (id,data)
    ON (target.data = source.data)
    WHEN NOT MATCHED  THEN
      INSERT (id,data)
      VALUES (source.id,source.data)
	when matched then 
	 update 
	 set 
		@i = 1
	output inserted.*
) X;

SELECT DISTINCT * FROM @t_output

drop table #t;
28 июн 16, 13:09    [19344841]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли в MERGE способ выдать OUTPUT, если не указан WHEN MATCHED?  [new]
invm
Member

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

На что хотели обратить внимание своим примером?
28 июн 16, 13:33    [19345024]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли в MERGE способ выдать OUTPUT, если не указан WHEN MATCHED?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4807
invm
a_voronin,

На что хотели обратить внимание своим примером?


Вас побудоражить
28 июн 16, 13:42    [19345093]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли в MERGE способ выдать OUTPUT, если не указан WHEN MATCHED?  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
a_voronin
Вас побудоражить
Ясно.
А я уж подумал, что в кои-то веки что-то умное написали...
28 июн 16, 14:16    [19345409]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить