【问题标题】:Stored procedure not being executed within another stored procedure存储过程未在另一个存储过程中执行
【发布时间】:2010-09-15 06:54:12
【问题描述】:

我发现在执行 SP1 时,SP2 不会从 SP1 中执行。

SP1的结构如下:

ALTER PROCEDURE SP1 AS BEGIN

Declare c1 cursor....

open c1 fetch next from c1 ...

while @@fetch_status = 0 Begin

...

Fetch Next from c1 end

close c1

deallocate c1

exec sp2

end

如果在 SQL Server 2005 管理工作室的“输出窗口”中打印,我看不到任何 PRINT 语句输出,因为“输出窗口”为空。

【问题讨论】:

  • 你试过调试存储过程吗?我想知道它是否没有甚至到达 exec sp2 行。
  • 您可能希望避免使用 Fetch Next。它们确实效率不高,而且对性能影响很大。
  • 谢谢你能建议一种不使用 fetch next 的替代方法吗?
  • 您是从命令行运行存储过程,还是从应用程序中运行存储过程?如果您在应用程序中执行它,请确保在 sp2 执行之前您的连接没有被关闭。

标签: sql sql-server sql-server-2005 stored-procedures


【解决方案1】:

如果您将存储过程代码作为单个查询运行会发生什么?如果你在 exec 之前和之后放置 PRINT 语句,你会看到两个输出吗?

  • 如果这样做,则必须已执行存储过程。可能它没有按照您的意愿行事。
  • 如果您没有看到任何打印输出,则说明循环中有问题
  • 如果您没有看到第二个输出但看到了第一个输出,则说明第二个存储过程有问题。

【讨论】:

    【解决方案2】:

    我不确定它是否对您有帮助,但根据我的经验,最常见的原因是:

    1. sp2 获取一些参数,使其成为 null 值 - 即,您从字符串构建它的名称,其中之一是 null
    2. sp2 里面有一些条件,但没有一个是真的,所以sp2 根本不执行任何代码——即参数之一是类型varchar,你传递值VALUE,在里面检查它,但是传递给 sp2 的实际值是 V(因为没有定义 varchar 长度)。
    3. sp2 根据参数构建查询,其中一个参数是 null,整个查询也变为 null

    如果您将PRINT 之前之后 调用sp2,您会看到任何输出吗?

    【讨论】:

      【解决方案3】:

      您可以使用@@error 来查看执行上一条语句时是否有错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-26
        • 2020-12-10
        • 2016-12-13
        • 2013-10-12
        • 1970-01-01
        • 1970-01-01
        • 2010-09-15
        • 1970-01-01
        相关资源
        最近更新 更多