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)
我该怎么做?
你可以这样做。
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
以防止重复。或者在可序列化隔离级别运行它以阻止并发插入。
归档时间: |
|
查看次数: |
5965 次 |
最近记录: |