Как выполнить хранимую процедуру с результатами запроса SQL в TSQL? - PullRequest
0 голосов
/ 30 мая 2011

Предполагается, что у меня есть таблица с задачами под названием Tasks.

Я хочу удалить выбранные задачи с помощью хранимой процедуры SP_Task_DEL (которая удаляет задачи).

Эта процедура имеет один параметр @Id (идентификатор задачи для удаления).

Как выполнить эту хранимую процедуру много раз со всеми результатами запроса:

select id from Tasks where status = 'completed'

Ответы [ 3 ]

3 голосов
/ 30 мая 2011

Это делается с помощью курсора.Зациклите результаты и выполните процедуру.Обратите внимание, что это медленно и, скорее всего, это можно сделать одним оператором удаления.

DECLARE @id int
DECLARE cur_delete CURSOR LOCAL READ_ONLY
FOR select id 
      from Tasks 
     where status = 'completed'

OPEN cur_delete
FETCH NEXT FROM cur_delete into @id

WHILE @@FETCH_STATUS = 0
  BEGIN
   EXEC SP_Task_DEL @id
   FETCH NEXT FROM cur_delete into @id
  END
CLOSE cur_delete
DEALLOCATE cur_delete

Самый простой способ удалить все выполненные задачи:

DELETE Tasks 
where status = 'completed'

Если есть ещеТаблицы, подлежащие очистке, необходимо использовать по следующей схеме.

BEGIN TRAN
  DELETE SubTasks
  FROM SubTasks st
  JOIN Tasks t (updlock)
    ON st.id = t.id
  WHERE t.status = 'completed' 

  if @@error <> 0 
    begin
      rollback tran
      goto THEEND
    end

  DELETE Tasks 
  where status = 'completed'
COMMIT TRAN
THEEND:
1 голос
/ 30 мая 2011

Вы можете использовать курсор для этого, например:

declare @id int
declare cur cursor local fast_forward for 
    select id from Tasks where status = 'completed'
open cur
fetch next from cur into @id
while @@fetch_status = 0
    begin
    EXEC dbo.SP_Task_DEL @id
    fetch next from cur into @id
    end
close cur
deallocate cur
1 голос
/ 30 мая 2011

Почему бы не создать другую хранимую процедуру, которая удаляет все выполненные задачи? Это было бы намного эффективнее, поскольку вы можете воспользоваться тем, что базы данных действительно очень эффективны при работе с наборами данных, а не с циклической обработкой отдельных элементов.

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