在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中的对象?
请大家帮帮忙,谢谢了。
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中的对象?
请大家帮帮忙,谢谢了。
with adoquery1 do
begin
close;
sql.Clear;
sql.Add('insert into #tempsellers(sno,sname) values(789,''greenfish'')');
execsql;
end;
我在ADOconnection中已设定connectionstring 为tempdb数据库,connected也设为true。
在sql server中执行insert into #tempsellers (sno,sname) values (123,'redcat');
是可以的。为什么在delphi中就不可以了呢?难道是与数据库的连接有问题,还请指点一下。
SQL Server 支持临时表。临时表就是那些名称以井号 (#) 开头的表。如果当用户断开连接时没有除去临时表,SQL Server 将自动除去临时表。临时表不存储在当前数据库内,而是存储在系统数据库 tempdb 内。
临时表有两种类型:
本地临时表
以一个井号 (#) 开头的那些表名。只有在创建本地临时表的连接上才能看到这些表。
全局临时表
以两个井号 (##) 开头的那些表名。在所有连接上都能看到全局临时表。如果在创建全局临时表的连接断开前没有显式地除去这些表,那么只要所有其它任务停止引用它们,这些表即被除去。当创建全局临时表的连接断开后,新的任务不能再引用它们。当前的语句一执行完,任务与表之间的关联即被除去;因此通常情况下,只要创建全局临时表的连接断开,全局临时表即被除去。
现在,临时表的许多传统用途可由具有 table 数据类型的变量替换
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;
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,而应该连接你自己实际业务数据库
創建臨時表與使用臨時表必須在同一個會話當中,也就是說你創建的表如果要讓ADOQUERY1去訪問的話。
必須將創建臨時表的代碼也在ADOQUERY1中執行。讓他們置於同一個會話當中。
但如果在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;这样还是不行,请问怎样实现这一功能?