我必须在 SQL Server 2005 的表中更新多行 (29)。
SELECT * from tblState ORDER BY StateCode ASC.
在这个表中有一个整数列,我需要分配从 1 到 29 的数字。例如
BEFORE
A 3
B 6
C 2
D 1
AFTER
A 1
B 2
C 3
D 4
如何有效地使用升序号更新每一行?
我必须在 SQL Server 2005 的表中更新多行 (29)。
SELECT * from tblState ORDER BY StateCode ASC.
在这个表中有一个整数列,我需要分配从 1 到 29 的数字。例如
BEFORE
A 3
B 6
C 2
D 1
AFTER
A 1
B 2
C 3
D 4
如何有效地使用升序号更新每一行?
WITH
sequenced_data AS
(
SELECT
ROW_NUMBER() OVER (ORDER BY StateCode ASC) AS sequence_id,
*
FROM
tblState
)
UPDATE
sequenced_data
SET
integer_column = sequence_id
当您要求循环时,我猜您可能不理解此代码。
因此,我强烈建议您创建一个虚拟表来玩这个,既要了解它的工作原理,又要确保它符合您的要求/期望。
WITH
语句类似于子查询 ROW_NUMBER()
创建你想要的顺序ID 您应该尽可能避免 SQL 中的循环。SQL Server 针对基于集合的操作进行了大量优化。
在这种情况下,您可以使用CTE
withROW_NUMBER
函数:
WITH CTE AS
(
SELECT StateCode, IntColumn
, RN = ROW_NUMBER() OVER (ORDER BY StateCode ASC)
FROM dbo.tblState
)
UPDATE CTE SET IntColumn = RN;
试试这个:
with CTE1 as(select StateCode,intcol,ROW_NUMBER() over (order by StateCode) as rn from tbln)
update CTE1 set intcol=rn
select * from tbln
您可以使用公用表表达式
with c as
(
select ID, ROW_NUMBER()
over (order by StateCode ASC) as cn
from tblState
)
update c set ID = cn
好的,不要将数字存储在表中,因为每次插入新行时都必须更改它。
做就是了
SELECT
ROW_NUMBER() OVER (ORDER BY StateCode ASC) sequence_id
, *
FROM
tblState
每次你把数据拿出来。
如果您有很多行并且需要快速执行此操作,请在StateCode ASC
我没有 cte 的选择:
UPDATE d
SET d.integer_column = d.sequence_id
FROM (
SELECT integer_column, ROW_NUMBER() OVER (ORDER BY StateCode ASC) AS sequence_id
FROM dbo.tblState
) d