C-P*_*uru 5 t-sql sql-server sql-server-2012
我需要使用以下代码重新编号表中的行,这些代码来自You've Been Haacked博客文章:
DECLARE @counter int
SET @counter = 0
UPDATE #myTable
SET @counter = ID = @counter + 1
Run Code Online (Sandbox Code Playgroud)
这可以很好地使用几个记录到几千个,但是当我在具有250K +记录的表上的SQL Server 2012(64位)实例上运行它时,我最终得到许多重复项(ID#1出现12次).总之,大约有27K条记录具有重复值.奇怪的是,大约19K有正好12个欺骗(我机器上的处理器数量相同).
重复的原因是什么?
我保证Phil Haack会打电话给我,但这并不能保证能够正常工作.扔掉这个代码.
可能的原因是并行性.该变量可能会在多个线程上受到重创.
奇怪的是,大约19K有正好12个欺骗(我机器上的处理器数量相同).
这符合解释.
使用ROW_NUMBER产生良好的保证工作的ID:
update t
set ID = r
from (
select *, row_number() over (order by something) r from T
) t
Run Code Online (Sandbox Code Playgroud)
同样简单但理智.