我有一张 table
| code | descd | slnum |
|------|-------|-------|
| 10 | a | 0 |
| 10 | b | 0 |
| 12 | c | 0 |
| 12 | d | 0 |
| 11 | e | 0 |
| 11 | f | 0 |
我必须使用具有循环的游标来更新 slnum 列
| code | descd | slnum |
|------|-------|-------|
| 10 | a | 1 |
| 10 | b | 2 |
| 12 | c | 1 |
| 12 | d | 2 |
| 11 | e | 1 |
| 12 | f | 3 |
如何解决这个问题?我已经尝试过这样的操作,但它没有给我正确的输出
DECLARE @value INT
DECLARE @s INT=1
DECLARE scursor CURSOR FOR
SELECT slnum
FROM trec
for update of slnum
OPEN scursor
FETCH NEXT FROM scursor
INTO @value
WHILE @@FETCH_STATUS = 0
BEGIN
if exists(select * from trec) -- missing
begin
update trec
set slnum=@s
where current of scursor
select @s=@s+1
end
else
begin
update trec
set slnum=@s
where current of scursor
end
FETCH NEXT FROM scursor INTO @value
END
CLOSE scursor
DEALLOCATE scursor
最佳答案
我不知道您是否必须使用游标,但您的查询对于使用ROW_NUMBER<的
:UPDATE
连接来说是一个死胡同。/
UPDATE t1
SET
slnum = t2.slnum
FROM
yourTable t1
INNER JOIN
(
SELECT code,
descd,
ROW_NUMBER() OVER(PARTITION BY code ORDER BY descd) AS slnum
FROM yourTable
) t2
ON t1.code = t2.code AND
t1.descd = t2.descd
关于sql-server - 使用具有循环的游标更新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39202116/