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;
难道要放在同一个语句里同时执行才行吗??不放在同一语句里同时执行临时表会释放掉??
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
.
你可以这样去测试,在企业管理器中选择某个数据库打开一查询,建一个临时表如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……
既然一个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
不同的会话,所创建的临时表不能互相访问,除非你创建的是全局临时表.
你可以试试这样:
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