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

Откуда: Москва
Сообщений: 4902
Задача, сделать так, что в UPDATE у MERGE была присвоено следующая SEQUENCE . Желательно добиться этого в самом MERGE. У кого-то есть идея.

CREATE SEQUENCE [T_Sequence] AS BIGINT START WITH -9223372036854775808 INCREMENT BY 1;
GO
CREATE TABLE [T]
(
	[rv] BIGINT NOT NULL DEFAULT (NEXT VALUE FOR [T_Sequence]), 
	[A] INT NOT NULL, 
	[B] INT NOT NULL 
) ON [PRIMARY]
GO 
INSERT INTO T (A, B) VALUES (1, 1)
INSERT INTO T (A, B) VALUES (2, 2)
GO 

select * from T
GO

		MERGE [T] AS target
		USING (
			SELECT 1 AS A, 10 AS B UNION ALL 
			SELECT 2 AS A, 20 AS B 
		) AS source 
		ON (
			 target.A = source.A
		)
		WHEN MATCHED 
		THEN UPDATE SET 
			 B = source.B
			,[rv] = DEFAULT;
GO

		MERGE [T] AS target
		USING (
			SELECT 1 AS A, 10 AS B, rv = (SELECT NEXT VALUE FOR [T_Sequence]) UNION ALL 
			SELECT 2 AS A, 20 AS B, rv = (SELECT NEXT VALUE FOR [T_Sequence]) 
		) AS source 
		ON (
			 target.A = source.A
		)
		WHEN MATCHED 
		THEN UPDATE SET 
			 B = source.B
			,[rv] = source.rv;
GO

		MERGE [T] AS target
		USING (
			SELECT 1 AS A, 10 AS B UNION ALL 
			SELECT 2 AS A, 20 AS B 
		) AS source 
		ON (
			 target.A = source.A
		)
		WHEN MATCHED 
		THEN UPDATE SET 
			 B = source.B
			,[rv] = NULL;
GO

		MERGE [T] AS target
		USING (
			SELECT 1 AS A, 10 AS B UNION ALL 
			SELECT 2 AS A, 20 AS B 
		) AS source 
		ON (
			 target.A = source.A
		)
		WHEN MATCHED 
		THEN UPDATE SET 
			 target.B = source.B;
GO
SELECT * FROM T

GO
DROP TABLE T;
GO
DROP SEQUENCE [T_Sequence]
4 май 16, 19:44    [19135274]     Ответить | Цитировать Сообщить модератору
 Re: MERGE и SEQUENCE  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
Чем не устраивает промежуточная таблица
declare @t table (A int, B int, rv bigint);
insert into @t
values
 (1, 10, next value for T_Sequence),
 (2, 20, next value for T_Sequence);
?
4 май 16, 20:10    [19135340]     Ответить | Цитировать Сообщить модератору
 Re: MERGE и SEQUENCE  [new]
msLex
Member

Откуда:
Сообщений: 9308
в merge - нельзя
в update+insert - можно
4 май 16, 20:21    [19135369]     Ответить | Цитировать Сообщить модератору
 Re: MERGE и SEQUENCE  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
В merge таки можно, но жерез ж...

1. Делаем Self-linked server.
2.
		MERGE [T] AS target
		USING (select * from openquery(Loopback, 'select t.A, t.B, next value for MyDB..T_Sequence as rv from (values (1, 10), (2, 20)) t(A, B)')) AS source 
		ON (
			 target.A = source.A
		)
		WHEN MATCHED 
		THEN UPDATE SET 
			 B = source.B
			,[rv] = source.rv;
4 май 16, 20:26    [19135395]     Ответить | Цитировать Сообщить модератору
 Re: MERGE и SEQUENCE  [new]
msLex
Member

Откуда:
Сообщений: 9308
invm
В merge таки можно, но жерез ж...

1. Делаем Self-linked server.
2.
		MERGE [T] AS target
		USING (select * from openquery(Loopback, 'select t.A, t.B, next value for MyDB..T_Sequence as rv from (values (1, 10), (2, 20)) t(A, B)')) AS source 
		ON (
			 target.A = source.A
		)
		WHEN MATCHED 
		THEN UPDATE SET 
			 B = source.B
			,[rv] = source.rv;


лучше уж распилить на insert/update чем loopback
4 май 16, 20:33    [19135410]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить