【发布时间】:2010-09-22 21:19:44
【问题描述】:
如果我想使用从 select 语句的结果集中返回的值来执行存储过程。所以 SP 应该被执行的次数等于 select 语句的结果集数。
除了使用光标来完成上述操作之外,还有其他方法吗?
更新
任何人都可以请至少提供带有 While 循环的示例代码吗?
【问题讨论】:
标签: sql-server tsql
如果我想使用从 select 语句的结果集中返回的值来执行存储过程。所以 SP 应该被执行的次数等于 select 语句的结果集数。
除了使用光标来完成上述操作之外,还有其他方法吗?
更新
任何人都可以请至少提供带有 While 循环的示例代码吗?
【问题讨论】:
标签: sql-server tsql
在 T-SQL 中只有两种迭代方式。 While 循环或游标。如果你不想使用游标,你必须像 James Wiseman 所说的那样使用 while 循环。
实现这种情况的另一种方法是 SQL CLR。如果您使用的是 SQL CLR,则可以使用所有 C#(或 VB.Net)迭代来达到您的目标。
【讨论】:
我会将 proc 转换为使用表变量并使用它传递数据集。这样做的美妙之处在于,一旦您进行了更改,您就可以将相同的 proc 用于单行插入或多行插入,并在集合中进行,而不是逐行进行。 为此,您需要 SQL Server 2008。
【讨论】:
您必须将您的 proc 转换为多语句表值 UDF..
create function dbo.udf_Whatever_That_Proc_Did(
@SameOldParam as int
)
AS Begin
Declare --same variables here
/*same code in your proc that does not
- invoke nondeterministic built-in function
- change state of database
- return messages to caller
*/
Return
End
使用功能:
Select *
from dbo.udf_Whatever_That_Proc_Did(9999)
【讨论】:
游标的替代方法是 while 循环,有时建议将其作为 SQL 游标的替代方法。
您想避免使用光标的问题,还是您希望完全避免迭代的问题?
【讨论】:
while loop应该没有问题
也许这可以帮助您,创建一个 UDF,然后从该 UDF 中调用存储的过程。由于您可以在选择查询中调用 UDF,因此它应该执行存储过程的次数与您在选择查询中获得的结果一样多。
【讨论】:
openrowset 调用它)