【问题标题】:How to make a loop calling a stored procedure in SQL Server 2008 R2?如何在 SQL Server 2008 R2 中循环调用存储过程?
【发布时间】:2012-08-13 15:00:29
【问题描述】:

我需要多次调用存储过程。我怎样才能把它放在一个循环中?

DECLARE @return_value int,
                @sinresultado varchar(200),
                @svcmensaje varchar(200)

EXEC    @return_value = [dbo].[ppocfdcancelacionwsejecuta]
                @evcrfcemisor = N'BBA940707IE1',
                @evcserie = N'XXAABB',
                @evcfolio = N'666',
                @sinresultado = @sinresultado OUTPUT,
                @svcmensaje = @svcmensaje OUTPUT

我需要让@evcfolio 在同一个循环中从 1 运行到 10。就像 java 中的 for 一样,evcfolio 的值在每个循环中增加 1。

感谢您的宝贵时间。

【问题讨论】:

  • 不要。您通过在循环中调用存储过程来增加应用程序的开销。考虑更改设计,以便您可以传入要查询的值列表并且只运行该过程一次。阅读Table Valued Parameters

标签: stored-procedures sql-server-2008-r2


【解决方案1】:
Declare @Counter int;
Declare @CounterText nvarchar(10);
Declare @return_value int,
                @sinresultado varchar(200),
                @svcmensaje varchar(200);
Set @Counter = 666;

While @Counter < 676
Begin
    Set @CounterText = Cast( @Counter As nvarchar(10));
    exec @return_value = [dbo].[ppocfdcancelacionwsejecuta]
                    @evcrfcemisor = N'BBA940707IE1',
                    @evcserie = N'XXAABB',
                    @evcfolio = @CounterText,
                    @sinresultado = @sinresultado OUTPUT,
                    @svcmensaje = @svcmensaje OUTPUT
    Set @Counter = @Counter + 1;
End

【讨论】:

  • SET @Counter = 666; While @Counter &lt;= 10?不正确的东西……你永远不会进入你的 WHILE 块。
  • 感谢您的更正,但是现在您将执行该过程 11 次,而不是 10 次。
【解决方案2】:

虽然我同意重组存储过程并让它处理循环(或 TVP 中的一个集合)而不是多次调用该过程是一种更好的方法,但与此同时,任何语言的循环都相当简单且你可以这样做:

DECLARE @i INT;
SET @i = 666;

WHILE @i <= 675
BEGIN
    EXEC ... @evcfolio = @i ...;
    SET @i += 1;
END

【讨论】:

    猜你喜欢
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多