我如何在SQL服务器中使用for循环

时间:2012-10-10 09:38:23

标签: sql sql-server

我必须更新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

如何有效地使用递增的序列号更新每一行?

6 个答案:

答案 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;

Bad Habits to Kick : Thinking a WHILE loop isn't a CURSOR

答案 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