在循环中执行存储过程以获取记录集
Posted
技术标签:
【中文标题】在循环中执行存储过程以获取记录集【英文标题】:Execute stored procedure in a loop for set of records 【发布时间】:2020-05-13 12:22:41 【问题描述】:我想编写一个存储过程来循环遍历一组记录,并为每个记录执行另一个存储过程。
选择查询返回的id列表:
select id
from abc
where some condition
我有一个存储过程usp_get_data @id=id
,我想为选择查询的每一行执行它。我不想使用光标。我还有哪些其他方法可以实现这一目标?
foreach(item in select statement)
execute stored procedure
子存储过程将返回一个记录列表,然后我将从主存储过程返回
【问题讨论】:
这能回答你的问题吗? SQL Call Stored Procedure for each Row without using a cursor 程序代码是高度特定于供应商的 - 所以请添加一个标签来指定您是否使用mysql
、postgresql
、sql-server
、oracle
或db2
- 或完全不同的东西。
您知道循环与游标并没有太大区别吗?你有什么理由不使用光标?
@Arti 你的意思是你需要它异步运行?
@Arti 每次迭代都从表中读取的循环也是如此
【参考方案1】:
我不想使用光标。我还有哪些其他方法可以实现这一目标?
重写存储过程以对一组数据进行操作。您可以使用table-valued parameter 将批量数据传递给存储过程,或者将数据加载到存储过程随后使用的临时表中。
或者使用光标。它们并不是最糟糕的事情,“为每一行调用一个存储过程”可能是游标最常见的合法用途。此外,没有光标的循环解决方案都是愚蠢的,比使用光标更糟糕。
【讨论】:
另一种选择,取决于存储过程的作用,是将它写成一个表值函数,可以是CROSS APPLY
'd。这并不总是可能的,但经常被忽视。
如果游标像某些人认为的那样糟糕,它们就不会被实现!
游标也很旧。它们与 25 年前基本相同,当时服务器运行单核 100MHz 处理器。那时“太慢”的东西几乎不再重要了。以上是关于在循环中执行存储过程以获取记录集的主要内容,如果未能解决你的问题,请参考以下文章
Entity Framework 6 中具有多个记录集的存储过程
oracle 存储过程执行动态SQL 返回结果给游标,外部程序获得dataset结果集。