try using global temporary table:create table ##temp(
No int,
Name varchar(10),
Price float
)
GO

解决方案 »

  1.   

    to tripofdream(梦之旅) :我想问一问如果同时有两个用户发出create table ##temp ,那么会有什么效果,是否会说table name重复?
      

  2.   

    抑或是对每个用户来说这个##temp是互相独立,互不影响?
      还有 #temp 和 ##temp 有什么不同?
      

  3.   

    一样,所以,你应该先判断一下表是不是存在!
    如果不做处理,Create Table会出现错误。
      

  4.   

    "本地临时表仅在当前会话中可见;全局临时表在所有会话中都可见。"为了区分同名的本地(局部)临时表,SQL SERVER会在内部给每个本地(局部)临时表加一个后缀,而全局临时表不能同名.
      

  5.   

    哎呀,现在create table ##temp就能正常的查询,create table #temp,查询就会说#temp是无效名,怎么样才能查询局部临时表
      

  6.   

    SQL SERVER OnLineBooks 中对"当前会话"说得很含糊,没作详细解释,实际上对存储过程而言,本地临时表只在存储过程内部可见,即使是在A存储过程中调用B存储过程,也无法在B存储过程外使用B存储过程创建的本地临时表.
      

  7.   

    在存储过程中创建局部临时表,当当前会话断开后即被系统自动清除
    你不可能在另一个会话中使用它创建临时表,一般是用于向客户段返回一些较复杂的数据结果,并不是用于向客户段返回一个临时表,例如create procedure myproc
    as
    create table #tableTemp(
    ID int,
    tatal int
    )insert into #tableTemp .......
    .....
    select * from #tableTempgo如果在你的存储过程加上select * from #Temp,客户端就不会报错了,但是仍对你可能没有用,因为该返回的结果集不可编辑如果你要在客户段使用一个临时表,建议你使用TClientDataset之类的东西
      

  8.   

    为避免全局临时表重名,可以借用SQL SERVER对本地临时表的处理方法,人为地在表名后加一个随机数.
      

  9.   

    我现在想随机为临时表起名字,测试的时候却又说我的表名是无效的,为什么?//SQL SERVER的储存过程:
    CREATE PROCEDURE [dbo].[TempTable] 
    @TableName varchar(20)
    AS
    create table ##@TableName(
    No int,
    Name varchar(10),
    goods varchar(20),
    Price float
    )
    GO
    //前端代码procedure TForm1.Button1Click(Sender: TObject);
    begin
    DM.ADOStoredProc1.Close;
    DM.ADOStoredProc1.Parameters.Items[1].Value:='temp';
    DM.ADOStoredProc1.ExecProc;end;procedure TForm1.Button2Click(Sender: TObject);
    begin
    DM.ADOQuery1.Close;
    DM.ADOQuery1.SQL.Clear;
    DM.ADOQuery1.SQL.Add('select * from ##temp');
    DM.ADOQuery1.Open;end;
      

  10.   

    第一
    你起的表名是##@TableName,是而不是你所希望的##temp
    如果你一定要这么做,应该是:
    CREATE PROCEDURE [dbo].[TempTable] 
    @TableName varchar(20)
    AS
    declare @str varchar(2000)
    select str='create table ##'+@TableName+' (No int,Name varchar(10),goods varchar(20),Price float) '
    exec (@str)
    GO第二,DM.ADOStoredProc1.close一旦执行,这个表就不存在乐第三,我重申该返回的结果集不可编辑第四,请看一下前面的帖子
      

  11.   

    参见楼上,不过,在DM.ADOStoredProc1.close执行后,全局临时表还会保持一个比较短的时间(我测试好象是1分钟)
      

  12.   

    收到消息
    在data access页有一个tclientdataset控件,有一个fielddefs属性,用它来创建你的临时表的结构在程序中加入
    clientdataset1.CreateDataSet;
    clientdataset1.Active:=true;这样就可以当作一个临时表使用
    如果要临时表数据,可以使用
    clientdataset1..EmptyDataSet;--------------------------------------------
    我先出去一趟
    如果还有疑问,请留下地址
    我给你发个例子
      

  13.   

    创建表参见楼上.不过全局临时表在DM.ADOStoredProc1.close执行后还会保持一段很短的时间(大概30S~60S左右).
      

  14.   

    clientdataset1..EmptyDataSet;
    应该是
    clientdataset1.EmptyDataSet;
      

  15.   

    tripofdream(梦之旅) :
    我忽然想到一个有意思的问题
    在临时表地生存期内,假设有另外一个连接在向临时表插入数据,当本地执行
    DM.ADOStoredProc1.close
    后服务器会发生什么?临时表还能倍删除吗?
      

  16.   

    用dataset建了一个临时表后怎么操纵他,例如查询和对临时表插入数据等,能否举个例子?
      

  17.   

    to: huang_2(今天有点烦) 
    把你的email给我,我给你发个例子
      

  18.   

    跟普通表的操作一样,而且你可以在SERVER上任何一个库中使用
      

  19.   

    用ADOQuery执行就行了。
    With AdoQuery1 Do
     Begin
       Close;
       Sql.Text:='CREATE PROCEDURE [dbo].[create] AS
                  create table #temp(
                  No int,
                  Name varchar(10),
                  Price float)';
       ExecSql;
     End;
      

  20.   

    to fredfei(飞飞) ,huang_2(今天有点烦) :
    我测试了一下,好象huang_2(今天有点烦) 的代码去掉DM.ADOStoredProc1.Close一句后并未出错,我觉得表名并未出错,因为传递了一个参数且其值为temp.
      

  21.   

    所以表名仍为##temp,即:##temp=##@tablename
      

  22.   

    飞飞:我的e-mail地址是:[email protected],请把你所说的用tclientdataset控件创建临时表的例子也给我发一个.谢谢!
      

  23.   

    你可以新建一个真正的Table,用完就删除就可以了吗?