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

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

Есть временная таблица. В ней нужно обновить значения поля Id по порядку, начиная с указанного значения:

if object_id('tempdb..#TestTable') is not null
	drop table #TestTable

create table #TestTable
(
	[Id] int null,
	[Value1] int not null,
	[Value2] datetime not null,
	[Value3] int null
)

-- вставка тестовых данных
insert into #TestTable values(null, 1, GETDATE(), null)
insert into #TestTable values(null, 1, GETDATE(), null)
insert into #TestTable values(null, 1, GETDATE(), null)
insert into #TestTable values(null, 1, GETDATE(), null)
insert into #TestTable values(null, 1, GETDATE(), null)
insert into #TestTable values(null, 1, GETDATE(), null)
insert into #TestTable values(null, 1, GETDATE(), null)
insert into #TestTable values(null, 1, GETDATE(), null)
insert into #TestTable values(null, 1, GETDATE(), null)
insert into #TestTable values(null, 1, GETDATE(), null)
--------------------------

declare @CountId int
declare @MaxId int
declare @CurrentId int

select @CountId = count(*) from #TestTable

select @CountId

set @MaxId = @CountId + 1000 -- устанавливается максимальное значение (+1000 для теста)
set @CurrentId = @MaxId - @CountId

update #TestTable set [Id] = @CurrentId, @CurrentId = @CurrentId + 1

select * from #TestTable


Иногда возникают дубли в обновленных значениях. Добавил в запрос указание не использовать параллельное выполнение:

update #TestTable set [Id] = @CurrentId, @CurrentId = @CurrentId + 1 option (maxdop 1)


Проблема стала возникать гораздо реже, но все равно имеет место быть. Подскажите, как можно обновить все записи таблицы по порядку, без дублей, без использования курсоров.
19 апр 14, 17:33    [15905280]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE всех значений по порядку  [new]
aleks2
Guest
Разучи, страдалец, ROW_NUMBER() OBER(...).
19 апр 14, 17:58    [15905343]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE всех значений по порядку  [new]
DachNik
Member

Откуда:
Сообщений: 72
Спасибо, попробую такой запрос:

update T set T.Id = @MaxId - T.IdNew + 1
from 
(
	select Id, row_number() over (order by Id) as IdNew
	from #TestTable
) as T option (maxdop 1)
19 апр 14, 18:39    [15905449]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить