如何使用SQL Server中的游标更新带有序号的列?

时间:2016-08-26 04:58:44

标签: sql-server

预期结果是

code    descd   slnum
======================
10       a       1
11       b       2
12       c       3

我试过这样但是我在某个地方错过了

DECLARE @DF TABLE(code int, descd varchar(7), slnum int)

INSERT INTO @DF VALUES(10, 'a', 0), (11, 'b', 0), (12, 'c', 0)

DECLARE @s as INT = 0
DECLARE @code as INT = 0

DECLARE scursor CURSOR FOR
    SELECT code, slnum 
    FROM @DF 
    FOR UPDATE of slnum

OPEN scursor

FETCH NEXT FROM scursor INTO @code, @s

WHILE(@@FETCH_STATUS = 0)
BEGIN
    UPDATE @DF
    SET @s = slnum = @s + 1 
    WHERE current of scursor

    FETCH NEXT FROM scursor INTO @code, @s
END

CLOSE scursor
DEALLOCATE scursor

3 个答案:

答案 0 :(得分:1)

一个简单的,基于集合的语句可以做 - 不需要杂乱和笨重的光标!!

试试这个:

WITH CTE AS
(
    SELECT 
        code,
        SeqNum = ROW_NUMBER() OVER (ORDER BY code)
    FROM
        @DF
)
UPDATE d
SET slnum = SeqNum
FROM @DF d
INNER JOIN CTE ON d.Code = CTE.code

现在,当你看着你的桌子时:

SELECT * FROM @DF

你应该得到这个输出:

enter image description here

这是你想要得到的 - 对吗?

答案 1 :(得分:0)

您可以without any order如下:

DECLARE @SeqNum INT = 0

UPDATE  @DF
SET slnum = @SeqNum,
    @SeqNum += 1

结果:

code        descd   slnum
----------- ------- -----------
10          a       1
11          b       2
12          c       3

答案 2 :(得分:-1)

DECLARE @ttb表(代码VARCHAR(5),descd VARCHAR(5),slnum int)
插入@ttb值(10,'a',0),(11,'b',0),(12,'c',0)
DECLARE @s INT = 1
DECLARE @value INT

DECLARE scursor CURSOR FOR

选择slnum
来自@ttb
更新slnum

OPEN scursor

FETCH NEXT FROM scursor
INTO @value

WHILE @@ FETCH_STATUS = 0
BEGIN
更新@ttb
设置slnum = @ s
scursor的电流 选择@ s = @ s + 1
FETCH NEXT FROM scursor INTO @value
END

CLOSE scursor
DEALLOCATE scursor
从@ttb

中选择*