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