SQL临时表问题??

在开发时遇到这样一个问题,执行
AD0Query.Close;
AD0Query.SQL.Text:=‘ IF EXISTS(SELECT 1 FROM TEMPDB.DBO.SYSOBJECTS WHERE ID=OBJECT_ID('TEMPDB.DBO.#temp_qxsj1' )) DROP TABLE #temp_qxsj1' 
  +‘ select * into #temp_qxsj1 from Table_a'
AD0Query.ExeclSql;
AD0Query1.Close;
AD0Query1.SQL.Text:='select * from #temp_qxsj1'
AD0Query1.Open;
提示找不到#temp_qxsj1表,明明没关闭连接,临时表应该不会释放掉
但如果改成这样就没问题,可以查到数据:
AD0Query.Close;
AD0Query.SQL.Text:=‘ IF EXISTS(SELECT 1 FROM TEMPDB.DBO.SYSOBJECTS WHERE ID=OBJECT_ID('TEMPDB.DBO.#temp_qxsj1' )) DROP TABLE #temp_qxsj1' 
  +‘ select * into #temp_qxsj1 from Table_a'
  +' '
  +'select * from #temp_qxsj1'
AD0Query.Open;

难道要放在同一个语句里同时执行才行吗??不放在同一语句里同时执行临时表会释放掉??

作者: t200021   发布时间: 2011-06-15

既然一个AD0Query已经被Close,那就意味着这个批结束了,再来一个AD0Query.ExeclSql,那就是另一个了.临时表应该会被释放掉.
你可以这样去测试,在企业管理器中选择某个数据库打开一查询,建一个临时表如select getdate()dt into #t
关掉这个查询窗口,重新打开一个,执行 select * from #t
会得到:
消息 208,级别 16,状态 0,第 1 行
对象名 '#t' 无效。
这两个窗口是在同一个连接上的,关闭前一个,就类似于你用
AD0Query.Close
.

作者: qianjin036a   发布时间: 2011-06-15

引用 1 楼 qianjin036a 的回复:
既然一个AD0Query已经被Close,那就意味着这个批结束了,再来一个AD0Query.ExeclSql,那就是另一个了.临时表应该会被释放掉.
你可以这样去测试,在企业管理器中选择某个数据库打开一查询,建一个临时表如select getdate()dt into #t
关掉这个查询窗口,重新打开一个,执行 select * from #t
会得到:
消息 208,级别 16,状态 0……


但是我的流程不是这样的,是以下的流程
1.执行AD0Query.Close
2.对AD0Query.SQL.Text赋值
3.执行AD0Query.ExeclSql(此时并没有关闭会话)
4.执行AD0Query1的close(还在同一会话中,注意是AD0Query1不是AD0Query)
5.对AD0Query1.SQL.TEXT赋值
6.执行AD0Query1.Open,从临时表中查询数据
从程序执行起一直都没退出会话,所以一直不知道错误原因

作者: t200021   发布时间: 2011-06-15

抱歉,没看到这个.
不同的会话,所创建的临时表不能互相访问,除非你创建的是全局临时表.
你可以试试这样:
C/C++ code
AD0Query.Close;
AD0Query.SQL.Text:=‘ IF EXISTS(SELECT 1 FROM TEMPDB.DBO.SYSOBJECTS WHERE ID=OBJECT_ID('TEMPDB.DBO.##temp_qxsj1' )) DROP TABLE #temp_qxsj1'  
  +‘ select * into ##temp_qxsj1 from Table_a'
AD0Query.ExeclSql;
AD0Query1.Close;
AD0Query1.SQL.Text:='select * from ##temp_qxsj1'
AD0Query1.Open;

作者: qianjin036a   发布时间: 2011-06-15