sql - 如何使用游标更新记录

标签 sql sql-server sql-server-2008

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

我正在使用 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

最佳答案

看起来您想为 empno 分配一个从 10 开始的递增值。

您可以使用 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

您的光标版本可能看起来像这样来做同样的事情。
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;  

关于sql - 如何使用游标更新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8652653/

相关文章:

sql - 不同类型的公共(public)表表达式

sql-server - 在 SQL Server 2008 中跨多个表、列使用全文搜索

sql-server - Windows Mobile .net 比照

sql - 如何重命名 SQL Server 中名称中带有方括号的内容?

php - MYSQL 根据日期选择,然后加入

c# - 从 SQL Server 并行读取

sql - 查询不存在的列不会失败

mysql - 连接特定列上的两个 SQL 查询结果

sql - 假阴性 : Job Step History

sql - Oracle 中的 EXCEPT 关键字