TSQL使EXECUTE语句同步

时间:2009-04-12 16:03:02

标签: sql sql-server tsql exec synchronous

我有两个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 Delay,它等待,但第二个EXEC语句永远不会退回。

感谢。

更新,以下是更多信息:

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

    更新2,发现问题(和我一样!!)

    GBN(和其他人)在答案上一点空白。 EXEC是同步的。问题?我对问题本身的理解......我曾提到

    1. 执行(N'MyDynamicallyGeneratedStoredProcedure') - 成功时返回0
    2. 应该是:

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

      1(b)执行(N'MyDynamicStoredProcedure') - 成功时返回0

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

      (我应该去生活!!)

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

正如gbn's answer指出的那样,EXECUTE是同步的。

问题可能是CRL存储过程中的SQL Connection对象与批处理脚本不在同一上下文中。运行EXECUTE (N'MyDynamicallyGeneratedStoredProcedure')

后,应该删除全局临时表

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

Accessing TSQL created #temp tables from CLR stored procedure. Is it possible?

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

请参阅本篇关于全球临时生命周期的文章(当消除阴茎温度时) Deleting Global Temporary Tables (##tempTable) in SQL Server