使用 CURSOR 进行简单的列更新

Simple column update using CURSOR

我创建了一个 table 并向其中添加了几行。这是脚本。

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON 
GO

CREATE TABLE [dbo].[xEmployee]
(
    [EmpID] [int] NOT NULL,
    [EmpName] [varchar](50) NOT NULL,
    [Salary] [int] NOT NULL,
    [Address] [varchar](200) NOT NULL,
    [YearlySalary] [int] NULL,

    PRIMARY KEY CLUSTERED ([EmpID] ASC)
) ON [PRIMARY]
GO

INSERT INTO [dbo].[xEmployee] ([EmpID], [EmpName], [Salary], [Address], [YearlySalary]) 
VALUES (1, N'Mohan', 12000, N'Noida', NULL),
       (2, N'Pavan', 25000, N'Delhi', NULL)
GO

如您所见,我有一个 Salary 列,它的数据已经存在。我又添加了一个名为 YearlySalary 的列。当前为空。

我需要使用游标更新此 YearlySalary 列。因此,对于第一行和第二行,它应该是 YearlySalary = Salary * 12

我正在尝试使用如下所示的光标。但是有些东西丢失了或者是不对的。有人可以让我知道我哪里出错了吗?

SET NOCOUNT ON
DECLARE @salary int
DECLARE @id int
DECLARE @yearlySalary int

DECLARE tempCursor CURSOR STATIC FOR
     SELECT EmpID,Salary, YearlySalary 
     FROM dbo.xEmployee 

OPEN tempCursor

IF @@CURSOR_ROWS > 0
BEGIN 
      FETCH NEXT FROM tempCursor INTO @salary

      WHILE @@FETCH_STATUS = 0
      BEGIN
          @yearlySalary = @salary * 12

          INSERT INTO dbo.xEmployee (EmpId, Salary,YearlySalary) 
          VALUES (@id, @salary, @yearlySalary)
      END 
END

CLOSE tempCursor
DEALLOCATE tempCursor
SET NOCOUNT OFF

为什么要为此使用游标?似乎 update 就足够了:

update dbo.xEmployee
    set YearlySalary = Salary * 12;

您应该避免使用游标,而更喜欢基于集合的操作。在某些情况下,需要游标,但不是为了这么简单的事情。

我自己做事应该更有耐心。我只是想在一个简单的小例子中试用 cursor,以便以后可以将它用于更难的例子。这是我能够让它工作的一种方式。谢谢你们。

SET NOCOUNT ON
DECLARE @salary int
DECLARE @Id int

DECLARE tempCursor CURSOR STATIC FOR 
     SELECT EmpId, Salary 
     FROM dbo.xEmployee 

OPEN tempCursor

IF @@CURSOR_ROWS > 0
BEGIN 
   FETCH NEXT FROM tempCursor INTO @Id, @salary

   WHILE @@FETCH_STATUS = 0  
   BEGIN
      print @salary

      UPDATE dbo.xEmployee  
      SET YearlySalary = (@salary * 12) 
      WHERE EmpID = @Id;

      FETCH NEXT FROM tempCursor INTO @Id, @salary
   END 
END

CLOSE tempCursor
DEALLOCATE tempCursor
SET NOCOUNT OFF