[英]How to execute stored procedure with sql query results in TSQL?
假设我有一个名为Tasks
的任务表。
我想使用存储过程SP_Task_DEL
(删除任务)删除选定的任务。
这个过程有一个参数@Id
(要删除的任务的id)。
如何使用所有查询结果多次执行此存储过程:
select id from Tasks where status = 'completed'
?
这是通过 cursor 完成的。 循环结果并执行该过程。 请注意,这很慢,很可能只需一个删除语句即可完成。
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:
为什么不创建一个不同的存储过程来删除所有已完成的任务? 这会更有效率,因为您可以利用数据库在处理数据集而不是循环单个项目方面非常有效的事实。
您可以为此使用 cursor,例如:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.