后续批次中临时表的并发问题?

时间:2011-10-17 13:26:56

标签: sql-server sql-server-2008 temp-tables

运行脚本时有时会出现问题。我在使用启动脚本的应用程序(我没有编写,因此无法调试)时遇到问题。这个应用程序没有从SQL Server返回完整的错误,只是错误描述,所以我不知道错误的确切位置。

我只有使用此工具的错误(它是一个使用DAC组件将查询直接发送到SQL Server的工具),如果我在管理工作室中手动运行查询我没有错误。 (此错误仅在特定数据库上发生。)

我的查询类似于:

SELECT * INTO #TEMP_TABLE
  FROM ANOTHER_TABLE 
GO

--some other commands here
GO

INSERT INTO SOME_OTHER_TABLE(FIELD1,FIELD2) 
  SELECT FIELDA, FIELDB
  FROM #TEMP_TABLE  

GO

DROP TABLE #TEMP_TABLE
GO

我得到的错误是#TEMP_TABLE不是有效对象

所以我怀疑DROP语句是在INSERT语句之前执行的。

但是,当GO出现时,AFAIK在下一个语句完成之前不会执行下一个语句。

现在我怀疑临时表不是这样......或者你有其他想法吗?

2 个答案:

答案 0 :(得分:3)

您的问题很可能是由于DROP TABLE导致SQL Server自动删除表之前的会话结束或DROP TABLE正在与其他代码不同的会话中执行(创建并使用临时表)导致表不可见。

我假设这里不涉及存储过程,因为看起来你只是在执行批处理,因为当退出存储过程时本地临时表也会被删除。

本文关于Temporary Tables in SQL Server

的本地临时表行为有一个很好的描述
  

您可以使用本地临时表进行内务管理;他们是   除非明确说明,否则当它们超出范围时会自动删除   使用DROP TABLE删除。它们的范围比桌子更宽松   变量,因此您不会在批量或批量中引用它们时遇到问题   在动态SQL中。本地临时表将自动删除   当前会话或程序的结束。把它放在最后   创建它的过程可能会导致头疼:本地化   在存储过程或会话中创建的临时表   完成后将被删除,因此无法引用它   调用创建表的存储过程的进程。它   但是,可以由执行的任何嵌套存储过程引用   由创建表的存储过程。如果是嵌套的   过程引用临时表和两个临时表   当时存在相同的名称,该表是查询被解析的   反对?

答案 1 :(得分:1)

我会启动SQL事件探查器并验证您的工具是否使用一个连接来执行所有批处理,或者是否断开连接/重新连接。它也可能是使用连接池。

无论如何,从文件执行SQL批处理非常简单,您可以非常快速地开发自己的工具并且更好。