【问题标题】:How i can use cursor to delete record from table我如何使用光标从表中删除记录
【发布时间】:2012-01-11 04:00:09
【问题描述】:

我想使用游标从表中删除记录。我该怎么做?

我使用 MSSQL 2008 Express 此代码不会从 #temp 中删除任何内容。我还尝试了 cursor_name 的 current 不起作用的地方。

这是我的示例代码:

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

提前致谢

【问题讨论】:

  • 看在上帝的份上,为什么要使用游标而不是简单的删除查询呢?你对你的 DBA 有怨恨吗?
  • 愚蠢的问题,但是您在 Employee 表中有任何 EmployeeID > 10 吗?另外你为什么要为此做一个游标?这是一种非常低效的方法。还要确保没有触发器会中止您的删除。
  • @JohnFx 不,我只是好奇,只是为了学习,实际上我也使用简单的删除语句
  • @JohnFX 也许他只是想确保创建尽可能多的争用:D TempDB 上的光标似乎是个好方法。 j/k vivek 有点。
  • @vivek - 不要作恶。你可能会擅长它。

标签: sql-server database-cursor


【解决方案1】:
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

这对我有用

【讨论】:

    【解决方案2】:

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

    delete from HumanResources.Employee where current of Employee_Cursor
    

    它被称为“定位删除”并在MSDN 中进行了描述。

    【讨论】:

      【解决方案3】:

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

      您已从游标中获取数据,但未将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 ;

      【讨论】:

      • 它和我的有什么不同? ,好吧,我试过但没用,无论如何感谢你的兴趣
      • 抱歉,回复晚了,不过我要改一下答案,请看一下,谢谢
      • 当代码看起来与原始代码如此相似时,突出显示已更改的内容通常很有帮助(我假设它将INTO 添加到第二个FETCH,因为这就是我即将要做的事情答案)
      • 我得到了答案,但无法发布
      • @Elias Hossain 是的,它可以工作,但是为什么两张桌子,我认为可以用一张来完成,我只是发布一种方式,也检查一下,感谢您的关注
      猜你喜欢
      • 2011-04-28
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2015-10-18
      相关资源
      最近更新 更多