不使用游标填充 table 的 ID 列

Filling the ID column of a table NOT using a cursor

已创建和使用没有 ID 列的表,但现在需要 ID 列。 (经典)

我听说没有光标就可以完成所有事情。我只需要每一行都包含一个不同的 int 值,所以我在寻找某种行号函数:

How do I use ROW_NUMBER()?

即使有这些例子,我也不能确切地说出如何使用它。

UPDATE [TableA]
SET [id] = (select ROW_NUMBER() over (order by id) from [TableA])

Subquery returned more than 1 value.

所以...是的,当然它 return 不止一个值。那么如何混合更新和行号来填充该列?

PS。我不需要精确的顺序,只需要唯一的值。我也想知道 ROW_NUMBER() 在这种情况下是否合适...

您可以使用 CTE 进行更新

例子

Declare @TableA table (ID int,SomeCol varchar(50))
Insert Into @TableA values
 (null,'Dog')
,(null,'Cat')
,(null,'Monkey')

;with cte as ( 
      Select *
            ,RN = Row_Number() over(Order by (Select null))
      From  @TableA
)
Update cte set ID=RN

Select * from @TableA

已更新Table

ID  SomeCol
1   Dog
2   Cat
3   Monkey

您也可以使用子查询作为

Declare @TableA table (ID int,SomeCol varchar(50))
Insert Into @TableA values
 (null,'Dog')
,(null,'Cat')
,(null,'Monkey');

UPDATE T1
SET T1.ID = T2.RN
FROM @TableA T1 JOIN
     (
       SELECT ROW_NUMBER()OVER(ORDER BY (SELECT 1)) RN,
              *
       FROM @TableA
     ) T2
ON T1.SomeCol = T2.SomeCol;


Select * from @TableA