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

Откуда:
Сообщений: 24
Добрый день

Возможен ли сабж.
Пример:
declare 
@tmpTable table (id int IDENTITY(1,1), FirstVal int null, SecondVal int null)
insert into @tmpTable (FirstVal, SecondVal )
values (100, 50)
insert into @tmpTable (FirstVal )
select (200)
insert into @tmpTable (FirstVal )
select (300)
insert into @tmpTable (FirstVal )
select (400)

update @tmpTable 
set SecondVal =
               case when id = 1 then t.SecondVal
                else (select IsNull(a.SecondVal,0)+t.FirstVal 
                      from @tmpTable a 
                      where a.id = t.id -1)
               end
from @tmpTable t


выдает результат:

idFirstValSecondVal
110050
2200250
3300300
4400400


а нужен результат:
idFirstValSecondVal
110050
2200250
3300550
4400950


Подскажите, пожалуйста, как можно его добиться без использования курсора одним апдейтом?
2 апр 13, 14:01    [14126501]     Ответить | Цитировать Сообщить модератору
 Re: Построчный коммит в update  [new]
mike_dav
Member

Откуда:
Сообщений: 24
как вариант можно конечно сделать так:
update @tmpTable 
set SecondVal =
               case when id = 1 then t.SecondVal
                else (select sum(a.FirstVal) 
                      from @tmpTable a 
                      where a.id <= t.id and a.id <> 1) + (select sum(a.FirstVal) 
                      from @tmpTable a 
                      where a.id = 1)
               end
from @tmpTable t

но интересует возможен ли, все-таки построчный коммит в update
2 апр 13, 14:15    [14126576]     Ответить | Цитировать Сообщить модератору
 Re: Построчный коммит в update  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
А почему тема называется "построчный коммит"?
Как это связано с тем, что внутри?
2 апр 13, 14:15    [14126578]     Ответить | Цитировать Сообщить модератору
 Re: Построчный коммит в update  [new]
mike_dav
Member

Откуда:
Сообщений: 24
iap,
тему назвал так, потому, что посчитал, что проблема именно в отсутствии построчного коммита в апдейте в момент его выполнения. Поправьте меня, пжста, если это не так.
2 апр 13, 14:18    [14126599]     Ответить | Цитировать Сообщить модератору
 Re: Построчный коммит в update  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31868
mike_dav
Возможен ли сабж.
Невозможен.
mike_dav
Подскажите, пожалуйста, как можно его добиться без использования курсора одним апдейтом?
Как добиться результата - вы уже написали, а построчного коммита никак.
2 апр 13, 14:18    [14126604]     Ответить | Цитировать Сообщить модератору
 Re: Построчный коммит в update  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31868
mike_dav
iap,
тему назвал так, потому, что посчитал, что проблема именно в отсутствии построчного коммита в апдейте в момент его выполнения. Поправьте меня, пжста, если это не так.
Непонятна, как тема относится к управлению транзакциями.
2 апр 13, 14:19    [14126608]     Ответить | Цитировать Сообщить модератору
 Re: Построчный коммит в update  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
Я, кажется, начинаю догадываться.
Есть ещё рекурсивное CTE
2 апр 13, 14:19    [14126612]     Ответить | Цитировать Сообщить модератору
 Re: Построчный коммит в update  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
iap
А почему тема называется "построчный коммит"?
Как это связано с тем, что внутри?
Взял вторую строку, сложил с первой, зафиксировал результат, перешел к следующей строке...
Для нее имеем: взял третью строку, сложил со второй...
Без фиксации предыдущего результата во второй строке 0, а значит сложение даст неверный результат...
Так и связано с темой :)
Как уже упоминалось когда-то ранее, для накопительного итога эффективнее применять курсор (ЕМНИП) :)
2 апр 13, 14:23    [14126635]     Ответить | Цитировать Сообщить модератору
 Re: Построчный коммит в update  [new]
mike_dav
Member

Откуда:
Сообщений: 24
alexeyvg,
возможно, она никак не относится.
суть вопроса была в том,можно ли в момент выполнения команды апдейт (до ее завершения) использовать измененные ранее (этой же командой) данные .
2 апр 13, 14:24    [14126640]     Ответить | Цитировать Сообщить модератору
 Re: Построчный коммит в update  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
;with cte1 as (
   select FirstVal, SecondVal ,id, 0 as level 
   from @tmpTable 
   where id = 1
   union all
   select t.FirstVal, SecondVal   =(cte1.SecondVal +t.FirstVal), t.id,level=level+1
   from @tmpTable  t
     inner join cte1 on t.id  = cte1.id+1
)
select * from cte1
2 апр 13, 14:40    [14126724]     Ответить | Цитировать Сообщить модератору
 Re: Построчный коммит в update  [new]
Glory
Member

Откуда:
Сообщений: 104751
mike_dav
суть вопроса была в том,можно ли в момент выполнения команды апдейт (до ее завершения) использовать измененные ранее (этой же командой) данные .

Нет
В вашем случае это и не нужно. Накопительный итог считается по-другому
2 апр 13, 14:43    [14126739]     Ответить | Цитировать Сообщить модератору
 Re: Построчный коммит в update  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
Кстати, версия сервера осталась неизвестной
2 апр 13, 14:46    [14126753]     Ответить | Цитировать Сообщить модератору
 Re: Построчный коммит в update  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31868
mike_dav
alexeyvg,
возможно, она никак не относится.
суть вопроса была в том,можно ли в момент выполнения команды апдейт (до ее завершения) использовать измененные ранее (этой же командой) данные .
В принципе можно через переменные, но порядок не гарантируется, так что нельзя.

Так что используйте один из предлагаемых вариантов.
2 апр 13, 14:48    [14126767]     Ответить | Цитировать Сообщить модератору
 Re: Построчный коммит в update  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34696
mike_dav
iap,
тему назвал так, потому, что посчитал, что проблема именно в отсутствии построчного коммита в апдейте в момент его выполнения. Поправьте меня, пжста, если это не так.


Это не так.
2 апр 13, 16:42    [14127487]     Ответить | Цитировать Сообщить модератору
 Re: Построчный коммит в update  [new]
mike_dav
Member

Откуда:
Сообщений: 24
всем спасибо за ответы, думаю, что тему можно закрывать.
2 апр 13, 16:43    [14127488]     Ответить | Цитировать Сообщить модератору
 Re: Построчный коммит в update  [new]
mike_dav
Member

Откуда:
Сообщений: 24
автор
Кстати, версия сервера осталась неизвестной

iap,
да, сорри, это поправлю.
2 апр 13, 16:46    [14127505]     Ответить | Цитировать Сообщить модератору
 Re: Построчный коммит в update  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
Cygapb-007
iap
А почему тема называется "построчный коммит"?
Как это связано с тем, что внутри?
Взял вторую строку, сложил с первой, зафиксировал результат, перешел к следующей строке...
Для нее имеем: взял третью строку, сложил со второй...
Без фиксации предыдущего результата во второй строке 0, а значит сложение даст неверный результат...
Так и связано с темой :)
Как уже упоминалось когда-то ранее, для накопительного итога эффективнее применять курсор (ЕМНИП) :)
COMMIT - это точно определённый в рамках SQL термин.
Можно, конечно, разговаривать всем известными словами,
подразумевая под ними, однако, что-то своё.
Но надо быть готовым к тому, что не поймут.
2 апр 13, 17:14    [14127664]     Ответить | Цитировать Сообщить модератору
 Re: Построчный коммит в update  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
iap, эх, надо было сразу оговориться, что это моя трактовка старттопика :)) согласен:)
2 апр 13, 17:23    [14127708]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить