Как я могу использовать курсор, чтобы удалить запись из таблицы - PullRequest
5 голосов
/ 11 января 2012

Я хочу использовать курсор для удаления записи из таблицы. Как я могу это сделать?

Я использую MSSQL 2008 Express, этот код ничего не удаляет из #temp. Я также пробовал, где текущее имя курсора не работает.

Вот мой пример кода:

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 ]

3 голосов
/ 16 января 2012
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 голосов
/ 23 октября 2014

Существует гораздо более простой ответ - используйте эту команду:

delete from HumanResources.Employee where current of Employee_Cursor

Она называется «Позиционированное удаление» и описана в MSDN .

0 голосов
/ 11 января 2012

Не могли бы вы попробовать следующие способы, спасибо за ваше время.

Вы извлекли данные из курсора, но не вставили переменные, пропущенные в цикле 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

Обновление: У меня есть изменения во 2-м FETCH утверждении, только что добавили ниже выделенную часть, спасибо

ПОЛУЧИТЬ СЛЕДУЮЩИЙ ОТ Employee_Cursor INTO @eid, @ nid ;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...