设置基于操作并调用存储过程

时间:2009-04-15 10:45:00

标签: sql sql-server

我正在研究一个存储过程,该过程对类中的学生执行一些操作

在最后一步中,它根据某些标准更新了一些学生的状态。

这一切都很直接,但我在这里陷入困境。 基本上,系统中存在一个名为

的sp
pUpdateStudentStatus(studentID, statusID, comments, userID)

只要更新单个用户的状态,应用程序就会使用此sp。除了更新状态外,它还会记录StudentStatusHistory表中的更改。

所以这就是我的困境,

  • 如果我想使用那个存储过程,我需要遍历记录(通过游标或自己写循环)
  • 如果我想保留所有操作集,我需要从pUpdateStudentStatus复制逻辑(将来可能会改变)

还有其他选择吗?你会选择哪一个?

我认为使用更新触发器的替代方法不是一种方法,因为我需要一些额外的细节,例如更改状态的用户的userId和评论

我正在使用SqlServer2005

4 个答案:

答案 0 :(得分:4)

您没有说明pUpdateStudentStatus是由您控制还是由第三方创建。

如果它是第三方SP,我认为您没有太多选择,只能使用游标/循环,因为SP的内部可能在将来的版本中发生变化。

如果SP在您的控制之下,另一种选择是创建一个pUpdateStudentStatus版本,其新名称将以基于集合的方式运行(可能通过接受参数的表变量),然后重写现有的pUpdateStudentStatus以充当包装器,在参数表中使用单行调用新过程。

答案 1 :(得分:2)

除非性能是一个问题(并且听起来这很可能是偶尔会运行的工作,甚至可能在工作时间以外安排),我个人会循环现有的程序。 CPU总是比DBA / Programmer时间便宜,并且维护考虑应该超越效率,除非通过不这样做对业务产生影响。无论哪种方式,您都应该记录为什么采用您在代码中选择的任何方法。

另外,如果您还没有文档制度,我建议在数据库中使用(至少)sp名称和描述性文本设置一个简单的文档表。由于存储过程/用户定义的函数的性质,保持概述控制已实现的功能,除非采用一些策略,并且我已经看到太多的数据库存在大量存储过程/ udf并且没有一种简单的方法,可以在哪里实现哪些功能。如果您的团队支持版本控制和完整文档,那么它们会受到鼓掌,但如果没有,那么在内部记录数据库本身就很简单,强大且快速获胜。

答案 2 :(得分:1)

如果你想保持基于操作的设置,那么很遗憾,你需要从pUpdateStudentStatus复制并粘贴sql。

您需要在一方面决定基于集合的更新的性能,另一方面决定代码重用(以及易维护性)。我知道我通常会选择哪一种,但您的选择取决于您对性能的需求与其他考虑因素。

答案 3 :(得分:1)

如果您正在执行少量记录,则可以接受循环,但如果批处理过程变得很大,则需要基于集合的代码。

如果您最终需要基于集合的逻辑,则另一种替代建议是更改proc以允许基于集合或单独插入。通过使参数可选(您的GUI需要检查以确保为单个插入传递所有必需的参数)并为要为基于集合的操作传入的batchnumber添加参数,您可以将两者的逻辑放在一个PROC。

如果批号为null,请执行当前操作。如果传递则转到proc的批处理部分。对于批处理,插入过程可以由生成新批次编号的另一个proc来确定,将要插入的信息插入到包含批次编号的工作表中。然后它使用batchnumebr作为插入过程的输入参数。

你仍然需要为这两种情况编写逻辑,但由于它们处于相同的过程中,它们将更容易维护,并且你不太可能忘记更新这两个过程。