10.08.2006, 16:05 | #1 |
Участник
|
обновление sorted by выборки
имеется следующий код:
while select forupdate _assemblyRollLine1 order by SortedOrder where(_assemblyRollLine1.RollId == RollId4Update) { _assemblyRollLine1.SortedOrder = i*1000; _assemblyRollLine1.update(); i++; } вопрос: должна ли данная конструкция привести к зацикливанию?
__________________
--- SHiSHok |
|
10.08.2006, 16:23 | #2 |
Участник
|
Нет.
Выборка делается один раз, и сортируется по указанным критериям. После чего осуществляется проход по записям. Последний раз редактировалось SANTAN; 10.08.2006 в 16:39. |
|
10.08.2006, 17:01 | #3 |
Модератор
|
Цитата:
Сообщение от SHiSHok
вопрос: должна ли данная конструкция привести к зацикливанию?
MSSQL, SP3, по SortedOrder есть некластерный индекс? http://support.microsoft.com/kb/843267/EN-US/ P.S. с ДИНАМИЧЕСКИМ курсором это поведение можно воспроизвести и на других версиях
__________________
-ТСЯ или -ТЬСЯ ? |
|
10.08.2006, 17:48 | #4 |
Участник
|
Цитата:
Сообщение от Vadik
P.S. с ДИНАМИЧЕСКИМ курсором это поведение можно воспроизвести и на других версиях |
|
10.08.2006, 17:58 | #5 |
Участник
|
Вот кстати, как это обойти:
http://axforum.info/forums/showthrea...9028#post89028 Правда не проверял. У меня нет этогоглюка. Но надеюсь поможет. |
|
10.08.2006, 18:17 | #6 |
Модератор
|
Цитата:
Сообщение от SANTAN
У меня на 2005 не получается...
Код: set nocount on go if object_id('tempdb..#t') is not null drop table #t go create table #t ([id] int not null identity primary key nonclustered, [value] int not null) go declare @i int set @i = 0 while @i < 10000 begin set @i = @i + 1 insert into #t ([value]) select rand() * 1000 end go create index IX_T_Value on #t([value]) go declare @id int, @value int, @cnt int declare cr cursor dynamic for select [id], [value] from #t order by [value] set @cnt = 0 open cr fetch next from cr into @id, @value while @@fetch_status = 0 begin set @cnt = @cnt + 1 print 'Итерация ' + convert(varchar, @cnt) + ', id=' + convert(varchar, @id) + ', value = ' + convert(varchar, @value) update #t set [value] = [value] + rand() * 1000 - 500 where [id] = @id fetch next from cr into @id, @value end close cr deallocate cr go drop table #t go - без создания некластерного индекса - с созданным индексом
__________________
-ТСЯ или -ТЬСЯ ? |
|
11.08.2006, 00:31 | #7 |
Участник
|
Цитата:
Сообщение от Vadik
МОЖЕТ
MSSQL, SP3, по SortedOrder есть некластерный индекс? Причем автор кода утверждает что он работал без проблем на момент написания (стоит MSSQL2ksp3 и апдейтов за это время не накатывалось)!
__________________
--- SHiSHok |
|
11.08.2006, 16:40 | #8 |
Модератор
|
Цитата:
Сообщение от SHiSHok
есть но индекс включает 2 поля : RollId,SortedOrder .
Причем автор кода утверждает что он работал без проблем на момент написания (стоит MSSQL2ksp3 и апдейтов за это время не накатывалось)! Обходные пути: - как уже указывалось выше, добавить ограничения, мешающие записи отобраться для повторного изменения - строить перечень записей для обновления (обычно контейнер). примеры видел, искать к сожалению сейчас не готов
__________________
-ТСЯ или -ТЬСЯ ? |
|
14.08.2006, 16:00 | #9 |
Участник
|
или просто убрать индекс по RollId,SortedOrder.
|
|
|
Похожие темы | ||||
Тема | Ответов | |||
обновление поля в заданной таблице | 7 | |||
Обновление перекрестных ссылок ест память | 22 | |||
Обновление процедуры закрытия склада в АХ 3.0 | 10 | |||
Обновление ... | 0 | |||
Обновление detail-таблицы | 1 |
|