运行脚本时有时会出现问题。我在使用启动脚本的应用程序(我没有编写,因此无法调试)时遇到问题。这个应用程序没有从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在下一个语句完成之前不会执行下一个语句。
现在我怀疑临时表不是这样......或者你有其他想法吗?
答案 0 :(得分:3)
您的问题很可能是由于DROP TABLE
导致SQL Server自动删除表之前的会话结束或DROP TABLE
正在与其他代码不同的会话中执行(创建并使用临时表)导致表不可见。
我假设这里不涉及存储过程,因为看起来你只是在执行批处理,因为当退出存储过程时本地临时表也会被删除。
本文关于Temporary Tables in SQL Server:
的本地临时表行为有一个很好的描述您可以使用本地临时表进行内务管理;他们是 除非明确说明,否则当它们超出范围时会自动删除 使用DROP TABLE删除。它们的范围比桌子更宽松 变量,因此您不会在批量或批量中引用它们时遇到问题 在动态SQL中。本地临时表将自动删除 当前会话或程序的结束。把它放在最后 创建它的过程可能会导致头疼:本地化 在存储过程或会话中创建的临时表 完成后将被删除,因此无法引用它 调用创建表的存储过程的进程。它 但是,可以由执行的任何嵌套存储过程引用 由创建表的存储过程。如果是嵌套的 过程引用临时表和两个临时表 当时存在相同的名称,该表是查询被解析的 反对?
答案 1 :(得分:1)
我会启动SQL事件探查器并验证您的工具是否使用一个连接来执行所有批处理,或者是否断开连接/重新连接。它也可能是使用连接池。
无论如何,从文件执行SQL批处理非常简单,您可以非常快速地开发自己的工具并且更好。