【问题标题】:Simple column update using CURSOR使用 CURSOR 进行简单的列更新
【发布时间】:2017-10-06 19:17:32
【问题描述】:

我创建了一个表格并在其中添加了几行。这是脚本。

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

【问题讨论】:

    标签: sql sql-server database cursor


    【解决方案1】:

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

    update dbo.xEmployee
        set YearlySalary = Salary * 12;
    

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

    【讨论】:

    • 我只是在尝试使用光标的普通示例。我知道更新可以在不使用光标的情况下工作
    • @Rihana。 . .如果您的光标代码使用update 而不是insert,将会有所帮助。但是,如果您想要一个适合游标的问题,请考虑类似于动态 SQL 的内容。例如,创建一个包含视图定义的表,然后循环遍历该表以定义视图。
    【解决方案2】:

    我应该更有耐心自己做事。我只是想为一个简单的小示例尝试 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-10
      • 2014-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多