在sql server中
create table ##tempsellers
(  sno  int  primary key,
   sname  char(20),
);在delphi中
  with adoquery1 do
begin
    close;
    sql.Clear;
    sql.Add('insert into  tempdb.dbo.#tempsellers(sno,sname) values(789,''greenfish'')');
    execsql;
end;运行时为何总是提示忽略了数据库名称‘tempdb’,将引用tempdb中的对象?
请大家帮帮忙,谢谢了。

解决方案 »

  1.   


    with adoquery1 do 
    begin 
        close; 
        sql.Clear; 
        sql.Add('insert into  #tempsellers(sno,sname) values(789,''greenfish'')'); 
        execsql; 
    end; 
      

  2.   

    临时表是不需要指定数据库名,sqlserver会自己在tempdb中处理临时表的内容。
      

  3.   

    可是不指定数据库名,又提示对象名'#tempsellers' 无效。又是怎么回事呢?
    我在ADOconnection中已设定connectionstring 为tempdb数据库,connected也设为true。
    在sql server中执行insert into #tempsellers (sno,sname) values (123,'redcat');
    是可以的。为什么在delphi中就不可以了呢?难道是与数据库的连接有问题,还请指点一下。
      

  4.   

    临时表   
      SQL   Server   支持临时表。临时表就是那些名称以井号   (#)   开头的表。如果当用户断开连接时没有除去临时表,SQL   Server   将自动除去临时表。临时表不存储在当前数据库内,而是存储在系统数据库   tempdb   内。   
        
      临时表有两种类型:     
        
      本地临时表     
      以一个井号   (#)   开头的那些表名。只有在创建本地临时表的连接上才能看到这些表。   
        
      全局临时表     
      以两个井号   (##)   开头的那些表名。在所有连接上都能看到全局临时表。如果在创建全局临时表的连接断开前没有显式地除去这些表,那么只要所有其它任务停止引用它们,这些表即被除去。当创建全局临时表的连接断开后,新的任务不能再引用它们。当前的语句一执行完,任务与表之间的关联即被除去;因此通常情况下,只要创建全局临时表的连接断开,全局临时表即被除去。   
        
      现在,临时表的许多传统用途可由具有   table   数据类型的变量替换
      

  5.   

    我连接master数据库处理的临时表内容procedure TForm1.Button1Click(Sender: TObject);
    var
      vSQL1, vsql2, vsql3: string;
    begin
      vSQL1 := 'create table #tempsellers(id int, name varchar(100))';
      vSQL2 := 'insert into #tempsellers(id,name) values(1,''qq'')';
      vsql3 := 'select * from #tempsellers';
      with  ADOQuery1 do
      begin
        close;
        sql.Clear;
        sql.Text := vsql1;
        ExecSQL;
        close;
        sql.Clear;
        sql.Text := vsql2;
        ExecSQL;
        close;
        sql.Clear;
        sql.Text := vsql3;
        open;
      end;
    end;
      

  6.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      with adoquery1 do
      begin
        close;
        sql.text := ' create table #tempsellers'+
                    '(  sno  int  primary key,'+
                    '  sname  char(20),'+
                    ');';
        ExecSql;
      end;
      with adoquery1 do
      begin
        close;
        sql.text := ' insert into #tempsellers values(789,''greenfish'')';
        Execsql;
      end;
      with adoquery1 do
      begin
        close;
        sql.text := ' select * from #tempsellers';
        open;
      end;
    end;不应该连接tempdb,而应该连接你自己实际业务数据库
      

  7.   


    創建臨時表與使用臨時表必須在同一個會話當中,也就是說你創建的表如果要讓ADOQUERY1去訪問的話。
    必須將創建臨時表的代碼也在ADOQUERY1中執行。讓他們置於同一個會話當中。
      

  8.   

    按照大家的方法可以了
    但如果在sql server中先创建局部临时表,在delphi中直接向表里面插入数据是不可以的是吗?
    比如说在sql 查询分析器里
    create table #tempsellers
    (  sno  int  primary key,
       sname  char(20),
    );然后在delphi中直接插入数据
    with adoquery1 do
      begin
        close;
        sql.text := ' insert into #tempsellers values(789,''greenfish'')';
        Execsql;
      end;
      with adoquery1 do
      begin
        close;
        sql.text := ' select * from #tempsellers';
        open;
      end;这样还是不行,请问怎样实现这一功能?