【问题标题】:EXEC Stored Procedure inside another doesn't wait to to finish另一个内部的EXEC存储过程不等待完成
【发布时间】:2011-01-30 20:44:12
【问题描述】:

我有一个存储过程,它在其中执行另一个过程。第二个有时需要一段时间才能运行,但第一个似乎在等待第二个之前完成。这导致数据丢失,本应由第二个程序更新。第一个过程中是否有超时限制,可以延长吗?

【问题讨论】:

  • 你从哪里执行存储过程?

标签: sql stored-procedures timeout


【解决方案1】:

创建一个新表:

LogInfo
LogID     int auto number/identity primary key
LogDate   date default current date and time
LogValue  string

在每个过程中添加这样的 INSERT:

INSERT INTO LogInfo (LogValue) VALUES ('starting procedure A')
...
INSERT INTO LogInfo (LogValue) VALUES ('Calling procedure B')
...

INSERT INTO LogInfo (LogValue) VALUES ('ending procedure A')

然后这样做

SELECT * FROM LogInfo ORDER BY LogID 

看看发生了什么,希望你能看到这一点,因为程序是按顺序运行的,而 B 在 A 之后无法完成:

starting procedure A
Calling procedure B
starting procedure B
ending procedure B
ending procedure A

【讨论】:

  • 或许可以在此日志表中添加一些列来跟踪您在执行期间的特定点看到更改或未更改的值?
  • 谢谢,我试试看。我不认为 A 可以在 B 之前完成,但我只是得到奇怪的结果。
  • @CL4NCY,这将以一种或另一种方式证明正在发生的事情。
【解决方案2】:

你理解错了。存储过程同步执行。然而,由于各种原因,内部过程的结果可能直到它们实际发生后才对外部过程可见。这可能就是为什么你看到的任何东西让你相信完成的顺序是不同步的。

【讨论】:

    【解决方案3】:

    我怀疑内部存储过程实际上正在完成/退出,因为存储过程按顺序和对称地运行。

    您可以尝试编写外部存储过程的脚本并将其放入 Management Studio,删除 Create Procedure 声明,将参数替换为 Declare 并添加 SET 语句以将它们设置为您在测试运行中使用的值。另外,在调用内部存储过程之后加上 Print 语句,看看它是否完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      • 2014-03-31
      • 2012-04-17
      • 1970-01-01
      • 2018-03-04
      • 1970-01-01
      • 2021-01-02
      相关资源
      最近更新 更多