【问题标题】: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
}

子存储过程将返回一个记录列表,然后我将从主存储过程返回

【问题讨论】:

  • 程序代码是高度特定于供应商的 - 所以请添加一个标签来指定您是否使用mysqlpostgresqlsql-serveroracledb2 - 或完全不同的东西。
  • 您知道循环与游标并没有太大区别吗?你有什么理由不使用光标?
  • @Arti 你的意思是你需要它异步运行?
  • @Arti 每次迭代都从表中读取的循环也是如此

标签: sql sql-server stored-procedures foreach


【解决方案1】:

我不想使用光标。我还有哪些其他方法可以实现这一目标?

重写存储过程以对一组数据进行操作。您可以使用table-valued parameter 将批量数据传递给存储过程,或者将数据加载到存储过程随后使用的临时表中。

或者使用光标。它们并不是最糟糕的事情,“为每一行调用一个存储过程”可能是游标最常见的合法用途。此外,没有光标的循环解决方案都是愚蠢的,比使用光标更糟糕。

【讨论】:

  • 另一种选择,取决于存储过程的作用,是将它写成一个表值函数,可以是CROSS APPLY'd。这并不总是可能的,但经常被忽视。
  • 如果游标像某些人认为的那样糟糕,它们就不会被实现!
  • 游标也很旧。它们与 25 年前基本相同,当时服务器运行单核 100MHz 处理器。那时“太慢”的东西几乎不再重要了。
猜你喜欢
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多