SQL SERVER OnLineBooks 中对"当前会话"说得很含糊,没作详细解释,实际上对存储过程而言,本地临时表只在存储过程内部可见,即使是在A存储过程中调用B存储过程,也无法在B存储过程外使用B存储过程创建的本地临时表.
在存储过程中创建局部临时表,当当前会话断开后即被系统自动清除 你不可能在另一个会话中使用它创建临时表,一般是用于向客户段返回一些较复杂的数据结果,并不是用于向客户段返回一个临时表,例如create procedure myproc as create table #tableTemp( ID int, tatal int )insert into #tableTemp ....... ..... select * from #tableTempgo如果在你的存储过程加上select * from #Temp,客户端就不会报错了,但是仍对你可能没有用,因为该返回的结果集不可编辑如果你要在客户段使用一个临时表,建议你使用TClientDataset之类的东西
用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;
to fredfei(飞飞) ,huang_2(今天有点烦) : 我测试了一下,好象huang_2(今天有点烦) 的代码去掉DM.ADOStoredProc1.Close一句后并未出错,我觉得表名并未出错,因为传递了一个参数且其值为temp.
还有 #temp 和 ##temp 有什么不同?
如果不做处理,Create Table会出现错误。
你不可能在另一个会话中使用它创建临时表,一般是用于向客户段返回一些较复杂的数据结果,并不是用于向客户段返回一个临时表,例如create procedure myproc
as
create table #tableTemp(
ID int,
tatal int
)insert into #tableTemp .......
.....
select * from #tableTempgo如果在你的存储过程加上select * from #Temp,客户端就不会报错了,但是仍对你可能没有用,因为该返回的结果集不可编辑如果你要在客户段使用一个临时表,建议你使用TClientDataset之类的东西
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;
你起的表名是##@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一旦执行,这个表就不存在乐第三,我重申该返回的结果集不可编辑第四,请看一下前面的帖子
在data access页有一个tclientdataset控件,有一个fielddefs属性,用它来创建你的临时表的结构在程序中加入
clientdataset1.CreateDataSet;
clientdataset1.Active:=true;这样就可以当作一个临时表使用
如果要临时表数据,可以使用
clientdataset1..EmptyDataSet;--------------------------------------------
我先出去一趟
如果还有疑问,请留下地址
我给你发个例子
应该是
clientdataset1.EmptyDataSet;
我忽然想到一个有意思的问题
在临时表地生存期内,假设有另外一个连接在向临时表插入数据,当本地执行
DM.ADOStoredProc1.close
后服务器会发生什么?临时表还能倍删除吗?
把你的email给我,我给你发个例子
With AdoQuery1 Do
Begin
Close;
Sql.Text:='CREATE PROCEDURE [dbo].[create] AS
create table #temp(
No int,
Name varchar(10),
Price float)';
ExecSql;
End;
我测试了一下,好象huang_2(今天有点烦) 的代码去掉DM.ADOStoredProc1.Close一句后并未出错,我觉得表名并未出错,因为传递了一个参数且其值为temp.