如何使用游标更新记录

viv*_*vek 2 sql sql-server sql-server-2008

我正在使用下面的查询来更新我的所有记录,但它从第二行开始更新如何修改它以从第1行进行更改?

我正在使用mssql 2008

我认为我不能@@FETCH_STATUS用作第一线,因为它是全球性的.

提前致谢

use vivdb

DECLARE @empno as int;
select @empno = 10;

DECLARE Employee_Cursor CURSOR FOR select * from emp
OPEN Employee_Cursor;

FETCH NEXT from Employee_Cursor

WHILE @@FETCH_STATUS = 0
   BEGIN

      update emp set empno = @empno;
      select @empno = @empno+1;

     FETCH NEXT from Employee_Cursor
   END;

CLOSE Employee_Cursor;
DEALLOCATE Employee_Cursor;
GO
Run Code Online (Sandbox Code Playgroud)

Mik*_*son 10

看起来你想要为从10开始的empno分配一个递增的值.

您可以使用CTE和row_number()来执行此操作.不需要游标.

;with C as
(
  select empno,
         9 + row_number() over(order by (select 1)) as NewEmpNo
  from emp       
)
update C
set empno = NewEmpNo
Run Code Online (Sandbox Code Playgroud)

游标版本可能看起来像这样做.

DECLARE @empno AS INT;
DECLARE @CurEmpNo AS INT;

SELECT @empno = 10;

DECLARE employee_cursor CURSOR FOR
  SELECT empno
  FROM   emp

OPEN employee_cursor;

FETCH NEXT FROM employee_cursor INTO @CurEmpNo

WHILE @@FETCH_STATUS = 0
  BEGIN
      UPDATE emp
      SET    empno = @empno
      WHERE  CURRENT OF employee_cursor;

      SELECT @empno = @empno + 1;

      FETCH NEXT FROM employee_cursor INTO @CurEmpNo
  END;

CLOSE employee_cursor;

DEALLOCATE employee_cursor;  
Run Code Online (Sandbox Code Playgroud)

  • 我希望有更多这样的答案。第一件事是“我认为你可能应该采取更好的方式”,但回答问题也包括实际的答案。 (2认同)
  • 这个答案基本上一下子教会了我几个新技巧。:) (2认同)