【问题标题】:How to pass values from a table parameter in a Stored Procedure to another Stored Procedure?如何将值从存储过程中的表参数传递到另一个存储过程?
【发布时间】:2015-02-06 21:21:51
【问题描述】:

我编写了一个名为FooUpsert 的存储过程,它可以在各种表中插入和更新数据。它采用许多提供数据的数字和字符串参数。这个过程很好,我不想修改它。

接下来,我正在编写另一个存储过程,将其作为一种批量插入/更新服务。

过程以原子事务的形式工作是同等重要的。一些数据被插入/更新而一些不被插入/更新是不可接受的。

在我看来,这样做的适当方法是设置一个表值过程,比如FooUpsertBulk。我开始用一个表参数编写这个存储过程,该参数保存的数据类似于传递给FooUpsert 的数据,我的想法是我可以一次读取一行,并为每一行中的值调用FooUpsert。我意识到这可能不是最佳实践,但再次强调,FooUpsert 已经编写完毕,而且FooUpsertBulk 每天最多运行几次。

问题是在FooUpsertBulk 中,我不知道如何迭代行并将每行中的值作为参数传递给FooUpsert。我确实意识到我也可以更改 FooUpsert 以接受 table-values 参数,但我不想重写 FooUpsert

请你们哪位 SQL 忍者告诉我如何做到这一点?

我的 SQL 服务器是 MS-SQL 2008。

【问题讨论】:

  • 你将被困在这一行中,因为你会痛苦地排着队……换句话说,速度很慢。无论如何,您将不得不更改您的程序之一。听起来您必须将 cough 光标 cough 添加到 FooUpsertBulk 以通过基于您的漂亮集合的表值参数并逐行调用另一个 proc。
  • ^^^^不能再同意了。无论如何,您必须更新存储过程。只需让一个 proc 在基于集合的操作中完成这两项操作即可。
  • 所以你会调用FooUpsertBulk 传递多行数据,只是为了在该过程中循环它们,所以每行调用FooUpsert?如果是这样,那与当前的操作有何不同? FooUpsert 当前是从另一个 proc 还是从应用程序代码调用?

标签: sql sql-server sql-server-2008 stored-procedures


【解决方案1】:

将各种查询包装到显式事务中(即BEGIN TRAN ... COMMITROLLBACK)使所有这些都成为原子操作。你可以:

  • 从应用程序代码开始事务(假设FooUpsert 由应用程序代码调用),因此也必须在那里处理提交和回滚。这仍然会留下许多小操作,但只需一个事务且无需更改代码。

  • 在 proc 中启动事务,在包含在 TRY / CATCH 中的循环中调用 FooUpsert,以便在对 FooUpsert 的任何调用失败时处理 ROLLBACK。

    李>
  • 将代码从 FooUpsert 复制到新的 FooUpsertBulk 中,该 FooUpsertBulk 接受来自应用代码的 TVP 并将所有内容作为基于集合的操作处理。调整FooUpsertBulk 中的每个查询,从处理各种输入参数到在 TVP 加入查询后从 TVP 表变量中获取字段。将FooUpsert 保留在原位,直到FooUpsertBulk 工作为止。

【讨论】:

    猜你喜欢
    • 2019-10-13
    • 1970-01-01
    • 2015-08-24
    • 2013-08-29
    • 2016-11-05
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多