繁体   English   中英

如何将值从存储过程中的表参数传递到另一个存储过程?

[英]How to pass values from a table parameter in a Stored Procedure to another Stored Procedure?

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

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

程序作为原子事务来完成其工作,这一点极为重要。 插入/更新某些数据而不插入或更新某些数据将是不可接受的。

在我看来,执行此操作的适当方法是建立一个表值过程, FooUpsertBulk 我开始使用表参数编写此存储过程,该表参数保存的数据类似于传递给FooUpsert ,其想法是我可以一次读取一行并为每行中的值调用FooUpsert 我知道这可能不是我们的最佳做法,但再次, FooUpsert已经写好,加上FooUpsertBulk将至多一天几次运行。

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

你们当中的SQL忍者可以请教我如何做到这一点吗?

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

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

  • 从应用程序代码开始事务(假设FooUpsert被应用程序代码调用),因此也必须在该处处理提交和回滚。 这仍然留下了许多小操作,但是只需要一个事务就不需要更改代码。

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

  • 将代码从FooUpsert复制到新的FooUpsertBulk ,该FooUpsertBulk从应用程序代码接受TVP并将所有内容作为基于集合的操作进行处理。 将TVP加入查询后,使FooUpsertBulk每个查询从处理各种输入参数变为从TVP表变量获取字段。 保持FooUpsert到位,直到FooUpsertBulk工作为止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM