Sql server 不使用光标填充表的ID列

Sql server 不使用光标填充表的ID列,sql-server,pivot,row-number,Sql Server,Pivot,Row Number,创建和使用表时没有使用和ID列,但现在需要ID列。(经典) 我听说没有光标什么都可以做。我只需要每一行包含一个不同的int值,所以我在寻找某种类型的行号函数: 即使有这些例子,我也不能确切地说出如何使用它 UPDATE [TableA] SET [id] = (select ROW_NUMBER() over (order by id) from [TableA]) 子查询返回了多个值 所以。。。是的,它当然返回多个值。那么,如何混合使用update和row number来填充该列呢 另外,

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

我听说没有光标什么都可以做。我只需要每一行包含一个不同的
int
值,所以我在寻找某种类型的行号函数:

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

UPDATE [TableA]
SET [id] = (select ROW_NUMBER() over (order by id) from [TableA])
子查询返回了多个值

所以。。。是的,它当然返回多个值。那么,如何混合使用update和row number来填充该列呢


另外,我不需要精确的顺序,只需要唯一的值。我还想知道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
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')

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

Select * from @TableA
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

您需要一个CTE或一个子查询来使用窗口功能要避免另一个经典问题,请使用
BIGINT
。我已经经历了三次崩溃,试图追踪在<82>代码> ID/COD>命中2147483648的情况下,在“午夜”的压力下引用<代码> ID>代码>字段的每一个实例。我知道没人认为它会变得那么大。直到它出现。@AntoinePelletier总是乐意帮忙:)这样你就可以加入到桌子里了。事实上,这也是可行的。