【发布时间】: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