我必须更新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
如何有效地使用递增的序列号更新每一行?
答案 0 :(得分:5)
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 答案 1 :(得分:2)
尽可能避免SQL中的循环。 SQL Server针对基于集合的操作进行了大量优化。
在这种情况下,您可以使用CTE
ROW_NUMBER
函数:
WITH CTE AS
(
SELECT StateCode, IntColumn
, RN = ROW_NUMBER() OVER (ORDER BY StateCode ASC)
FROM dbo.tblState
)
UPDATE CTE SET IntColumn = RN;
答案 2 :(得分:0)
试试这个:
with CTE1 as(select StateCode,intcol,ROW_NUMBER() over (order by StateCode) as rn from tbln)
update CTE1 set intcol=rn
select * from tbln
答案 3 :(得分:0)
您可以使用公用表格表达式
with c as
(
select ID, ROW_NUMBER()
over (order by StateCode ASC) as cn
from tblState
)
update c set ID = cn
答案 4 :(得分:0)
好的,不要将数字存储在表格中,因为每次插入新行时都必须更改它。
只做
SELECT
ROW_NUMBER() OVER (ORDER BY StateCode ASC) sequence_id
, *
FROM
tblState
每次你拿出数据。
如果您有很多行,并且需要快速执行此操作,请在StateCode ASC
答案 5 :(得分:0)
我的选择没有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