2011-05-30 89 views
0

假设我有一个名为Tasks的任务表。如何用TSQL中的sql查询结果执行存储过程?

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

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

select id from Tasks where status = 'completed' 

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

回答

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 
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: 
+0

虽然这并严格回答这个问题,有可能是在光标一个更深层次的问题是效率低下,有许多处理的更好的方法整个问题。 – 2011-05-30 11:31:19

+1

我添加了正确的方式,因为你评论科林;) – 2011-05-30 11:35:03

+0

+1:这是一个非常好的答案。 – 2011-05-30 12:01:21

1

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

相关问题