2

我有两个 TSQL EXEC 语句

EXECUTE (N'MyDynamicallyGeneratedStoredProcedure') -- return 0 on success
SELECT @errCode = @@ERROR ;

IF (@errCode = 0)
BEGIN
  EXEC 'A Sql Statement using ##temptable created from first', @returnValue
END

如何使两个 EXEC 同步?; 现在第二个 EXEC 不会等待第一个 EXECUTE 完成。我尝试发出 WaitFor 延迟,它等待但第二个 EXEC 语句永远不会返回。

谢谢。

更新,这里有更多信息:

  1. 首先执行创建一个全局临时表并从一个复杂的 SELECT 查询中填充它。
  2. 第二个 EXEC 是一个 CLR 存储过程,它根据最近创建和填充的全局临时表中的变量生成动态 SP。

现在第二个 EXEC 抱怨找不到 Global Temp 表。

更新 2,发现问题(还有我!!)

GBN(和其他人)对答案持空白。执行是同步的。问题?我对问题本身的理解..我提到过

  1. EXECUTE (N'MyDynamicallyGeneratedStoredProcedure') -- 成功返回 0

它应该是:

1(a) EXECUTE (N'CreateMyDynamicStoredProcedure') -- 成功返回 0

1(b) EXECUTE (N'MyDynamicStoredProcedure') -- 成功返回 0

我错过了 1(b) 实际上是在其他地方和步骤 (2) 之后执行的。

(我应该去活下去!!)

4

2 回答 2

5

执行是同步的。第二个在第一个之后运行。总是。

您是否有多个连接运行相同的代码?您正在使用对所有连接都可见的全局临时表,因此它可能看起来像异步执行...

于 2009-04-12T16:11:14.070 回答
1

正如gbn 的回答所指出的,EXECUTE 是同步的。

问题可能是 CRL 存储过程中的 SQL Connection 对象与批处理脚本不在同一个上下文中。您的全局临时表应该在运行后被删除EXECUTE (N'MyDynamicallyGeneratedStoredProcedure')

确保您通过传递创建 SQLConnection 对象"context connection=true" Here is the post answer,其中有人在访问临时表时遇到类似问题,因为 SQLConnection 不在同一连接上下文中。

从 CLR 存储过程访问 TSQL 创建的 #temp 表。是否可以?

如果您的第二个 CRL 存储过程通过不同的连接运行,则 CRL sproc 将无法访问全局临时表,因为它应该已被删除。

请参阅这篇关于 Global Temporary life cycle (when the gloal temp is dropped)
Deleting Global Temporary Tables (##tempTable) in SQL Server 的帖子

于 2009-04-12T18:17:12.990 回答