使用查询生成的参数运行存储过程

时间:2010-04-05 21:16:44

标签: sql sql-server tsql

找到开发人员who think cursors are gauche并不难,但我想知道如何解决以下问题:

假设我有一个名为 uspStudentDelete 的proc,它将@StudentID作为参数。

uspStudentDelete应用了一堆级联软删除逻辑,在“类”,“等级”等表上标记一个标志为非活动状态。 uspStudentDelete经过了很好的审查,已经工作了一段时间。

在查询结果上运行 uspStudentDelete 的最佳方式是什么(例如,从<= em> TSQL TSQL中选择学生... EM>?

2 个答案:

答案 0 :(得分:3)

这正是游标的目的:

declare c cursor local for <your query here>
declare @ID int
open c
fetch next from c into @id
while @@fetch_status = 0 
    begin
    exec uspStudentDelete @id
    fetch next from c into @id
    end
close c
deallocate c

大多数反对游标的人认为你应该在适当的客户端中执行此操作,例如C#桌面应用程序。

答案 1 :(得分:3)

最好的解决方案是编写一个基于集合的proc来处理删除(尝试通过游标运行它来删除10,000条记录,你会明白为什么)或者将基于集合的代码添加到当前的proc中参数告诉你运行proc的基于集合或单个记录的部分(至少为了维护目的将它们保存在一起)。

在SQL Server 2008中,您可以使用表变量作为输入变量。如果你将proc重写为基于set的,你可以拥有相同的逻辑并运行它,无论proc是在一个记录还是一万个中发送。您可能需要在其中进行批处理,以避免一次删除数百万条记录并将表锁定数小时。当然,如果你这样做,你还需要调整当前sp的调用方式。