假设我有一个名为Tasks
的任务表。
我想删除存储过程SP_Task_DEL
(删除任务)的所选任务。
此过程有一个参数@Id
(要删除的任务的ID)。
如何使用查询的所有结果多次执行此存储过程:
select id from Tasks where status = 'completed'
答案 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