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时添加了正确的方法;)