【问题标题】:Execute stored procedure for all the result set without using cursor不使用游标对所有结果集执行存储过程
【发布时间】:2010-09-22 21:19:44
【问题描述】:

如果我想使用从 select 语句的结果集中返回的值来执行存储过程。所以 SP 应该被执行的次数等于 select 语句的结果集数。

除了使用光标来完成上述操作之外,还有其他方法吗?

更新
任何人都可以请至少提供带有 While 循环的示例代码吗?

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    在 T-SQL 中只有两种迭代方式。 While 循环或游标。如果你不想使用游标,你必须像 James Wiseman 所说的那样使用 while 循环。

    实现这种情况的另一种方法是 SQL CLR。如果您使用的是 SQL CLR,则可以使用所有 C#(或 VB.Net)迭代来达到您的目标。

    【讨论】:

    • SQL CLR 不是我的选择。
    【解决方案2】:

    我会将 proc 转换为使用表变量并使用它传递数据集。这样做的美妙之处在于,一旦您进行了更改,您就可以将相同的 proc 用于单行插入或多行插入,并在集合中进行,而不是逐行进行。 为此,您需要 SQL Server 2008。

    【讨论】:

    【解决方案3】:

    您必须将您的 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)
    

    【讨论】:

    • 我认为我们不能在 UDF 中使用 exec 语句。不过不确定。
    【解决方案4】:

    游标的替代方法是 while 循环,有时建议将其作为 SQL 游标的替代方法。

    您想避免使用光标的问题,还是您希望完全避免迭代的问题?

    【讨论】:

    • 我想避免迭代。但我认为使用while loop应该没有问题
    【解决方案5】:

    也许这可以帮助您,创建一个 UDF,然后从该 UDF 中调用存储的过程。由于您可以在选择查询中调用 UDF,因此它应该执行存储过程的次数与您在选择查询中获得的结果一样多。

    【讨论】:

    • 我认为,但我不确定,UDF 等于 SP。我认为UDF比SP更有限。我们可以创建一个临时表并操作数据并将它们插入 UDF 中的临时表吗?
    • 您不能直接从 UDF 中调用存储过程(尽管可以通过不可扩展的 hack 打开新连接并通过 openrowset 调用它)
    • 我认为我们只能在 UDF 中调用扩展存储过程
    • @bahadir arslan - 您不能在 UDF 中创建临时表,但可以使用表变量。
    • 杰夫 O,你是对的。那么我们可以在 UDF 中插入一个物理表吗?我不这么认为。
    猜你喜欢
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 2016-10-25
    • 2013-10-15
    相关资源
    最近更新 更多