假设我有一个名为Tasks
的任务表。如何用TSQL中的sql查询结果执行存储过程?
我想用存储过程SP_Task_DEL
(删除任务)删除选定的任务。
此过程有一个参数@Id
(要删除的任务的标识)。
select id from Tasks where status = 'completed'
:
如何使用查询的所有结果执行此存储过程多少次?
假设我有一个名为Tasks
的任务表。如何用TSQL中的sql查询结果执行存储过程?
我想用存储过程SP_Task_DEL
(删除任务)删除选定的任务。
此过程有一个参数@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:
为什么不创建一个不同的存储过程来删除所有完成的任务?这样做会更有效率,因为您可以利用数据库在处理数据集方面非常高效,而不是在单个项目上循环的事实。
虽然这并严格回答这个问题,有可能是在光标一个更深层次的问题是效率低下,有许多处理的更好的方法整个问题。 – 2011-05-30 11:31:19
我添加了正确的方式,因为你评论科林;) – 2011-05-30 11:35:03
+1:这是一个非常好的答案。 – 2011-05-30 12:01:21