使用 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
我创建了一个 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