簡體   English   中英

如何在 TSQL 中使用 sql 查詢結果執行存儲過程?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM