2017-10-06 52 views
0

我創建了一個表,並添加了幾行。這是腳本。簡單的列更新使用CURSOR

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 

回答

0

我應該對自己做事更耐心。我只是想試試一個簡單的例子,以便稍後可以使用它。這是我能夠使其工作的一種方式。多謝你們。

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 
3

爲什麼要爲此使用光標?這似乎是一個update就足夠了:

update dbo.xEmployee 
    set YearlySalary = Salary * 12; 

你應該避免光標,寧願基於集的操作。在某些情況下,需要使用遊標,但不是爲了這麼簡單。

+0

我只是想使用光標的一個正常的例子。我知道更新可以不使用遊標 – Rihana

+1

@Rihana。 。 。如果你的遊標代碼使用'update'而不是'insert',這將會有所幫助。但是,如果你想在遊標適當的地方出現問題,可以考慮動態SQL的問題。例如,創建一個包含視圖定義的表格,並循環遍歷表格以定義視圖。 –