Jquery 如何在TSQL中使用sql查询结果执行存储过程?

Jquery 如何在TSQL中使用sql查询结果执行存储过程?,jquery,tsql,stored-procedures,Jquery,Tsql,Stored Procedures,假设我有一个名为tasks的任务表 我想使用存储过程SP\u Task\u DEL(删除任务)删除选定的任务 此过程有一个参数@Id(要删除的任务Id) 如何使用所有查询结果多次执行此存储过程: select id from Tasks where status = 'completed' 这是用光标完成的。在结果上循环并执行过程。请注意,这很慢,很可能只需一条delete语句即可完成 DECLARE @id int DECLARE cur_delete CURSOR LOCAL READ_O

假设我有一个名为
tasks
的任务表

我想使用存储过程
SP\u Task\u DEL
(删除任务)删除选定的任务

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

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

select id from Tasks where status = 'completed'

这是用光标完成的。在结果上循环并执行过程。请注意,这很慢,很可能只需一条delete语句即可完成

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:
开始传输
删除子任务
从子任务st
加入任务t(updlock)
ON st.id=t.id
其中t.status='completed'
如果@错误0
开始
回滚传输
转到终点
结束
删除任务
其中status='completed'
提交传输
最后:

这是用光标完成的。在结果上循环并执行过程。请注意,这很慢,很可能只需一条delete语句即可完成

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:
开始传输
删除子任务
从子任务st
加入任务t(updlock)
ON st.id=t.id
其中t.status='completed'
如果@错误0
开始
回滚传输
转到终点
结束
删除任务
其中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 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

虽然这严格地回答了这个问题,但可能还有一个更深层次的问题,那就是游标效率低下,而且有很多更好的方法来处理整个问题。我在您评论Colin时添加了正确的方法;)虽然这严格地回答了这个问题,但可能还有一个更深层次的问题,那就是游标效率低下,而且有很多更好的方法来处理整个问题。我在您评论Colin时添加了正确的方法;)