预期结果是
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
答案 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
你应该得到这个输出:
这是你想要得到的 - 对吗?
答案 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