sql server删除临时表时的错误(200分)

  • 主题发起人 主题发起人 canna
  • 开始时间 开始时间
C

canna

Unregistered / Unconfirmed
GUEST, unregistred user!
在使用sql server 2000的应用系统中,不同的连接的客户,在删除同名的其他连接
正在使用的临时表(#tp_tmp)时,出现异常。
删除语句为:
if exists (select * from tempdb..sysobjects where name like '#tp_tmp%')
drop table #tp_tmp
错误信息为:
Cannot drop the table '#tp_tmp', because it does not exist in the system catalog.

我想,这删除语句有缺陷,即虽然tempdb..sysobjects 中有临时表#tp_tmp存在,
但它属于不同的连接,系统无法删除。
请帮忙完善删除语句,避免该错误。谢谢!
 
临时表就是临时存在的表,用完之后系统就会自己把它删掉,所以用不找您老操心了^_^
 
如果在同一连接中,再次使用该临时表,会出现该表已存在的异常
 
那你别建临时表咯~这样就能删掉咯
 
close #tp_tmp
 
试以下
if exist(select object_id('tempdb..#tp_temp'))
drop table #tp_tmp
 
试了没有,建议用楼上的试试.
 
临时表还用删除吗?断开连接后会自动删除的呀
 
如果你还要用就先断开再连接:)
 
这是我的一段代码
with cwxtdm.aqycreatebbfx do
begin
close;
sql.clear;
sql.text := 'create table #temp_bbfx(xm varchar(30),fxrq real)'
try
execsql;
execpt
close;
sql.clear;
sql.text := 'drop table #temp_bbfx';
execsql;
close;
sql.clear;
sql.text := 'create table #temp_bbfx(xm varchar(30),fxrq real)' ;
execsql;
end;
end;
你用try
except
end;
去捕捉异常。
然后让程序继续执行就行了
 
select * from tempdb..sysobjects where name like '#tp_tmp%'
你看看NAME 他是什么???
select * from tempdb..sysobjects where name like '#t%'这是我写的,执行结果为
NAME=#t__________________________________________________________________________________________________________________000000000310
 
目前没有找到好方法,但你也不一定要删除临时表呀
if exists (select * from tempdb..sysobjects where name like '#tp_tmp%')
delete from #tp_tmp
这样不好吗?
 
不同的session创建不同的临时表,用完后系统就会自动释放之源了。所以在这方面你不用太在意,
sqlserver会帮你搞定!用where name like '#tp_tmp%'并不能保证一定可以找到正确的临时表,
因为临时表由于设计上的原因不允许重名,因而它的实际表名会用到一个好象叫什么全球唯一ID什么
的,就像是COM/DCOM的ClassID一样,就算是同一个用户,在不同时间连接上数据库所创建的#temp_table
也会不同,呵呵,跑题了,又一个骗分的! ^_^
 
to 天真:#tp_tmp要删除,因为后续语句需要再生成#tp_tmp:
select * into #tp_tmp from ...
不删除,会出异常。
其他的代码尚未测试。mlzhou的是否复杂了些
 
query1.close;//已经删除了临时表
query1.sql.clear;
query1.sql.add('create table #tmpTable .... )
....
try
open;
exception
execsql;
end
 
ban1976说的原理是对的,可惜没说明方法如何避免该错误。
其实ms sql server自己的生成临时表的语句(如 select * into #...,creat table #...)
已有此功能,即不同连接(session)生成的同名临时表,不会相互影响,而且内容也不
相同。这正是临时表应用的一个优势:为不同的session提供不同的内容。
if exists (select * from tempdb..sysobjects where name like '#tp_tmp%')
drop table #tp_tmp
的问题出在能判断同名临时表的存在,却未判断是否是本session生成的,
如果存在同名临时表,但不是本session生成的,drop table 时就会出本人的问题。
在打开两个以上query analyser生成两个以上同名临时表后
看一下select name,right(name,3) from tempdb..sysobjects
可知临时表name的最右边三个数字(或字符)是决定该临时表的session标志。
这是从哪里来的,如何简捷地利用来判断 某临时表是否属于本session?我还没想好,
也请大侠指点



 
这个问题我碰到过,用此方法可以解决,即:
if exists (select * from tempdb..sysobjects where id=object_id('tempdb..#tp_tmp'))
drop table #tp_tmp
并不需要知道临时表的Session标志
 
创建这样的临时表是看不到的,在存储过程中最好是用完立即关闭,然后立即删除
 
试试这个:
if exists(select name from dbo.sysobjects where name='tp_tmp')
drop table tp_tmp
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
I
回复
0
查看
493
import
I
后退
顶部