2011-04-25 128 views
0

我的问题是调用存储过程中的存储过程

在另一个存储过程中调用存储过程中的存储过程。 这种发展何时是有害的?

为了促进代码的可重用性,我们将各种插入/更新语句封装到存储过程中。因此,如果想要插入A Foo记录,那么您可以将参数传递给CreateFoo存储过程,并开始一天的工作。

好让我们假设一个对象需要创建一个酒吧对象也创建马克对象。

因此您的存储过程将调用存储过程,然后将调用酒吧存储过程,然后将调用标记存储过程。

什么时候这不是一个好主意,以及我的其他选择。非常感谢你。 如果可以的话,你能否提供备份答案的来源。再次非常感谢你。

+0

你一次只插入一行吗? – 2011-04-25 17:14:04

+0

是的。当我打电话给** FOO **的时候,但是如果我没有这样做,那么存储过程不得不做很多事情,但实际上它会产生负面影响。你是说如果我只是插入1行我应该只是复制插入语句无处不在我使用它而不是调用存储过程? – gh9 2011-04-25 17:21:08

+0

那么你会如何插入'10000''foo'行?你会在10000次循环中调用该过程? – 2011-04-25 17:25:01

回答

3

这不好还是不好 - 如果你需要从另一个程序中调用一个程序,就这样做。

在存储过程中实现对数据库级别的逻辑是不是在大多数情况下做事情的好办法:

  • 它使你的应用程序依赖于这个特定的DBMS
  • 更复杂的规模数据库层上的应用程序然后在中间层上缩放它。
  • 它复杂的调试(除非你可以把你的SP断点)
  • SP语言(SQL)通常是不灵活和强大的中间层语言

但对于某些应用程序(它可能是你的情况),最好是使用SP - 当利弊被专业人士殴打时:简单快速地执行你所熟悉的语言逻辑。

+0

我相信我错误地传达了一些东西。这实际上是我想要完成的。我们有一个见证记录,这个见证记录包含一个personID,它是人表的主键。此表包含与该人有关的所有信息。我们先要插入人员记录,然后把证人身份和证件放在证人记录中。我们希望能够拥有一个插入人的通用sp,因此我们不必重复人员recod插入 – gh9 2011-04-25 17:30:51

+0

@ gh9 - 这是有道理的。它不适合基于设置的处理,所以我可能会试图使用'OUTPUT'子句而不是'SCOPE_IDENTITY'和'Table Valued Parameters'而不是标量参数来允许处理一个多行插入的可能性更多基于集合的方式。 – 2011-04-25 17:39:00

+0

Sql Server 2005,没有表值参数。为什么输出条款会比返回语句更好? – gh9 2011-04-25 17:48:06