如何解决如何在TSQL中使用sql查询结果执行存储过程?
| 假设我有任务名为“ 0”的表。 我想使用存储过程SP_Task_DEL
删除所选任务(删除任务)。
此过程有一个参数@Id
(要删除的任务的ID)。
如何使用所有查询结果多次执行此存储过程:
select id from Tasks where status = \'completed\'
?
解决方法
您可以为此使用游标,例如:
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
, 这是用游标完成的。循环搜索结果并执行过程。请注意,这很慢,很可能可以使用一个删除语句来完成。
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:
, 为什么不创建另一个删除所有已完成任务的存储过程?这将更加有效,因为您可以利用这样一个事实,即数据库在处理数据集方面确实非常有效,而不是遍历单个项目。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。