如何用SQL中的sql查询结果执行存储过程?

时间:2011-05-30 11:25:21

标签: jquery tsql stored-procedures

假设我有一个名为Tasks的任务表。

我想删除存储过程SP_Task_DEL(删除任务)的所选任务。

此过程有一个参数@Id(要删除的任务的ID)。

如何使用查询的所有结果多次执行此存储过程:

select id from Tasks where status = 'completed'

3 个答案:

答案 0 :(得分:3)

这是通过游标完成的。循环结果并执行该过程。请注意,这很慢,最有可能只用一个删除语句完成。

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 :(得分:1)

为什么不创建一个删除所有已完成任务的不同存储过程?这样会更有效率,因为您可以利用数据库在处理数据集时非常有效而不是循环遍历各个项目这一事实。

答案 2 :(得分:1)

您可以使用光标,例如:

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