[英]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.