在SQL里建立临时表,为什么只能用一次呢(20分)

  • 主题发起人 主题发起人 zenghongqing
  • 开始时间 开始时间
Z

zenghongqing

Unregistered / Unconfirmed
GUEST, unregistred user!
我建立了存储过程,并建立临时表,为什么临时表只能用一次呢?当再一次用的时候就提示"数据库中已存在名为 '#orderdet2' 的对象。"这应该如何解决呢,还有就是如何判断是否存在临时表,请大家帮帮忙,小弟在此谢过了
 
是存储过程中的临时表吗?如果是,那要看你是在哪里用这个存储过程了。
如果是在isqlw的同一个窗口中调用,则需要手动删除。如果是在Delphi中调用,则不会出现这个问题。
如果是单独在Delphi中用临时表,请加上前缀tempdb
 
>>>如何判断是否存在临时表...

这个是判断临时表的函数;不知道是不是你想要的。

function TableExists(TableName:String):Boolean;
var
Sl:TStrings;
cnn:TADOConnection;
begin
Sl:=TStringList.Create; cnn:=TADOConnection.Create(nil);
try
cnn.ConnectionString:=strA+ExtractFilePath(ParamStr(0))+mdb+strB;
cnn.LoginPrompt:=false; cnn.GetTableNames(Sl,True);
Result:=Sl.IndexOf(TableName)<> -1 ;
finally
cnn.Free; Sl.Free;
end;
end;
 
有几个字串是这样的。

const
strA='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=';
strB=';Persist Security Info=False';
mdb='DATA/EartyNMG.mdb';
 
如果存在就删除:
begin
qryDelece:=TADOQuery.Create(nil);
try
if TableExists(tempTable)=true then
begin
with qryDelece do
begin
ConnectionString:=strA+ExtractFilePath(ParamStr(0))+mdb+strB; //
Close;SQL.Clear;SQL.Add('drop table tempTable');ExecSQL; //
end;
end;
finally
qryDelece.Free;
end;
end;


如果不存在就建立:

begin
qry:=TADOQuery.Create(nil);
try
with qry do
begin
ConnectionString:=strA+ExtractFilePath(ParamStr(0))+mdb+strB; //
Close;SQL.Clear;SQL.Add('select * into tempTable from SurceTable');ExecSQL; //
end;
finally
qry.Free;
end;
end;
 
1、临时表是与连接对象相关联的,如果A运行了程序,生成了#TEMPXX,B也运行了这个程序,也生成了#TEMPXX,2个表虽然在服务器里面同名,但是并不冲突的,A和B都能正常访问自己所建立的#TEMPXX。
2、临时表的存活期由连接期决定,如果A断开了一下,再连接来访问#TEMPXX,表是不存在的。

LZ所说的存储过程使用临时表,是由服务器端开辟了一个连接对象去建立的,使用完了,当然给释放掉了,第二次调用,肯定就找不到原先建立的那个表了。

如果要在存储过程多次访问,只能使用固定表,如果嫌占用空间,那么就在TEMPDB下面建立,那个空间不用管,反正服务器重新启动,那个数据库就清空。
但是无论哪种做法,就失去了共享的特性了,无法解决多个用户同时建同名表的问题,只能在程序里面生成不同名的表,以防止同名刷坏其他用户的表。
 
多人接受答案了。
 
后退
顶部