如何将表中的 ID=null 值更新为增量计数器值?

Eri*_*art 3 sql-server identity update row

在 SQL Server 2012 上,我有一个用于将现有数据与新数据合并的中间/暂存表,我想在其中为新创建的行插入数字 ID:

ID   NaturalID               Comment

1    franknfurther03071972   blahblah
2    chrisrock12081980       nonsense
null clairecampbell24121990  merry christmas
3    walterhermes22032001    young guy
4    tanjaolsen16051996      nice
null timharris20041999       came late
Run Code Online (Sandbox Code Playgroud)

带有“空”ID 的行是新的,编号的 ID 是那些已经存在于主目标表中的行。NaturalID 可以唯一标识一个条目(实际上是多列)。我想在当前最大 ID 之后将“空”ID 设置为增量值,此处为:5 和 6,在找到更多空 ID 时增加。

目前,我使用游标遍历 ID 为 null 的行并使用值更新每个 ID,但由于它确实是一个非常大的表,因此需要几天时间。

我尝试使用 row_number() 进行更新,但它给了我一个错误“窗口函数只能出现在 SELECT 或 ORDER BY 子句中。”:

update StagingTable set ID=ROW_NUMBER() over (order by NaturalId)
from StagingTable where id is null  -- fails
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

Mar*_*ith 6

你可以这样做。

WITH T
     AS (SELECT ISNULL((SELECT MAX(ID) FROM StagingTable), 0) + 
                    ROW_NUMBER() OVER (ORDER BY NaturalID) AS New_ID,
                ID
         FROM   StagingTable
         WHERE  ID IS NULL)
UPDATE T
SET    ID = New_ID 
Run Code Online (Sandbox Code Playgroud)

所以在SELECT列表中使用了窗口函数,但您仍然可以将它的结果用于UPDATE列。

您可能应该有一个过滤索引唯一约束,ID WHERE ID IS NOT NULL以防止重复。或者在可序列化隔离级别运行它以阻止并发插入。

  • @ErikHart - 呃。什么?它看起来不像(或执行类似)游标...... (2认同)