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

Откуда: СПб
Сообщений: 244
MS SQL 2008

Есть MERGE вида
MERGE ...
WHEN MATCHED THEN
UPDATE SET ...
WHEN NOT MATCHED THEN
INSERT ...
OUTPUT $action;

Очень хочется подсчитать количество Insert, Update и не хочется при этом заполнять отдельную таблицу выходных операций, типа
declare @Test table (Operation varchar(10))

MERGE ...
OUTPUT $action into @Test;

select Operation, count(*) over (partition by Operation) from @Test

На конструкции вида
declare @Test table (Operation varchar(10), Value int)

insert into @Test (Operation, Value)
select Operation, count(*)
from (
MERGE ...
OUTPUT $action
) x (Operation) group by Operation;

грязно ругается
"The GROUP BY clause is not allowed when the FROM clause contains a nested INSERT, UPDATE, DELETE, or MERGE statement."

Ну и трюки с select Operation, count(*) over (partition by Operation) кончаются примерно так же
"Windowed functions are not allowed in the SELECT clause when the FROM clause contains a nested INSERT, UPDATE, DELETE, or MERGE statement."


Обмануть никак?
26 авг 09, 13:07    [7581576]     Ответить | Цитировать Сообщить модератору
 Re: Количество операций по типам в операторе MERGE  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
BOL2008:

Если функция @@ROWCOUNT (Transact-SQL) используется после инструкции MERGE, она возвращает общее количество вставленных, обновленных и удаленных строк из клиента.

Сообщение было отредактировано: 26 авг 09, 13:21
26 авг 09, 13:20    [7581679]     Ответить | Цитировать Сообщить модератору
 Re: Количество операций по типам в операторе MERGE  [new]
remi_
Member

Откуда: СПб
Сообщений: 244
Это то конечно. Только хочется отдельно по операциям: кол-во Update, кол-во Insert.
26 авг 09, 13:58    [7581936]     Ответить | Цитировать Сообщить модератору
 Re: Количество операций по типам в операторе MERGE  [new]
remi_
Member

Откуда: СПб
Сообщений: 244
Жалко. Я надеялся мне подскажут хитрый финт, а теперь приходится довольствоваться тупым

declare @Inserted int, @Updated int, @Deleted int
declare @Test table (Operation varchar(10))

insert into @Test (Operation)
select Operation
from (
MERGE ....
OUTPUT $action
) x (Operation);

SELECT @Inserted='INSERT', @Updated='UPDATE', @Deleted='DELETE'
FROM (SELECT Operation FROM @Test) a
PIVOT
(
count(Operation)
FOR Operation IN ([INSERT], [UPDATE], [DELETE])
) p

Работает, но эстетического удовольствия не доставляет.

Неужели я научился задавать правильные вопросы (недоверчево чешет в затылке)?
27 авг 09, 08:53    [7584778]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить