2012-01-11 52 views
4

我想用光标从表中删除记录。我该怎么做?如何使用光标删除表中的记录

我使用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 

在此先感谢

+2

对于所有神圣的爱,为什么你用光标来代替简单的删除查询呢?你对DBA有怨恨吗? – JohnFx 2012-01-11 04:10:15

+0

愚蠢的问题,但你有雇员表中的任何EmployeeID> 10?另外你为什么要为此做一个光标?这是一个非常低效的方法。 还要确保没有触发器正在中止删除。 – Jordan 2012-01-11 04:12:20

+0

@JohnFx不,我只是好奇地做,只是为了学习,在实践中我也使用简单的删除语句 – vivek 2012-01-11 04:13:18

回答

2
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 

这对我的作品

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声明的变化,只是增加了下面突出的部分,由于

NEXT来去Employee_Cursor INTO @eid,@nid;

+0

它与我的不同吗? ,好吧,我尝试过,但没有工作,无论如何感谢您的兴趣 – vivek 2012-01-11 05:01:35

+0

对不起,对于最近的回复,但是,我要改变我的答案,请看看它,谢谢 – 2012-01-11 06:57:14

+0

当代码看起来如此类似于原,它通常对于突出显示已经改变的内容非常有帮助(我假设它将'INTO'添加到第二个'FETCH'中,因为这就是我正要回答的问题) – 2012-01-11 07:42:44

1

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

delete from HumanResources.Employee where current of Employee_Cursor 

这就是所谓的 '定位删除',并在MSDN描述。