我如何使用游标从表中删除记录

时间:2012-01-11 04:00:09

标签: sql-server cursor

我想用光标从表中删除记录。我该怎么办?

我使用MSSQL 2008 Express这段代码不会删除#temp中的任何内容。我也尝试过当前的cursor_name不起作用。

以下是我的示例代码:

use AdventureWorks

drop table #temp
select * into #temp from HumanResources.Employee;

declare @eid as int;
declare @nid as varchar(15);


DECLARE Employee_Cursor CURSOR FOR
SELECT A.EmployeeID, A.NationalIDNumber FROM #temp AS A
OPEN Employee_Cursor;
FETCH NEXT FROM Employee_Cursor INTO @eid , @nid ;
WHILE @@FETCH_STATUS = 0
   BEGIN
      IF (@eid > 10)
      BEGIN
        delete from #temp where #temp.EmployeeID = @eid;
      END
      FETCH NEXT FROM Employee_Cursor;
   END;
CLOSE Employee_Cursor;
DEALLOCATE Employee_Cursor;
GO

select * from #temp

提前致谢

3 个答案:

答案 0 :(得分:3)

use AdventureWorks

select * into #temp from HumanResources.Employee;

declare @eid as int;
declare @nid as varchar(15);

DECLARE Employee_Cursor CURSOR FOR
SELECT A.EmployeeID, A.NationalIDNumber FROM #temp AS A
OPEN Employee_Cursor;
FETCH NEXT FROM Employee_Cursor INTO @eid , @nid ;
WHILE @@FETCH_STATUS = 0
   BEGIN
      IF (@eid > 10)
      BEGIN
        delete from #temp where current of Employee_Cursor
      END
      FETCH NEXT FROM Employee_Cursor INTO @eid , @nid ;
   END;
CLOSE Employee_Cursor;
DEALLOCATE Employee_Cursor;

select * from #temp

drop table #temp

这对我有用

答案 1 :(得分:2)

有一个更简单的答案 - 使用此命令:

delete from HumanResources.Employee where current of Employee_Cursor

它被称为'定位删除'并在MSDN处描述。

答案 2 :(得分:0)

谢谢你的时间,请你试试以下方式。

您已从光标中提取数据,但未在WHILE循环中输入错过的变量,请查看下面的代码,谢谢。

drop table #temp
select * into #temp from Employee;

declare @eid as int;
declare @nid as varchar(15);


DECLARE Employee_Cursor CURSOR FOR
    SELECT A.EmployeeID, A.NationalIDNumber FROM #temp AS A

OPEN Employee_Cursor;
FETCH NEXT FROM Employee_Cursor INTO @eid , @nid ;
WHILE @@FETCH_STATUS = 0
   BEGIN
      IF (@eid > 10)
      BEGIN
        delete from #temp where #temp.EmployeeID = @eid;
      END
      FETCH NEXT FROM Employee_Cursor INTO @eid , @nid ;
   END;
CLOSE Employee_Cursor;
DEALLOCATE Employee_Cursor;
GO

select * from #temp

<强>更新 我在第二个FETCH语句中进行了更改,只是添加了下面突出显示的部分,谢谢

FETCH NEXT FROM Employee_Cursor INTO @eid,@ nid ;