如何动态创建临时表

时间:2021-12-24 12:15:54
在存储过程中,需要创建临时表
====================静态语句创建临时表=========================
begin
  --创建临时表 
  select * into #tt from t where 1=2

  --写入数据
  insert into #tt select * from t

  --删除临时表
  drop table #tt
end
==================================================================
用以上的语句是没有问题的,但是我需要用动态的方式去创建。因为我有很多表需要处理,每一个表都需要生成一个对应的临时表。如果用以上的方式,那么我就要对每个表都要写一个类似上面的代码,这样很不灵活。我期望用动态语句的方式去实现。
======================动态语句创建临时表==========================
begin
declare @sql varchar(100)

set @sql='select * into #tt from t where 1=2'
execute (@sql)

set @sql='insert into #tt select * from t'
execute (@sql)

drop table #tt
end
==================================================================

但是在执行上面的动态语句时,发现在执行第二个sql语句的时候,报‘#tt not found’的错误。我估计是用动态语句创建的时候,execute后就把临时表给删除了。那么,我该如何解决这个问题呢?

9 个解决方案

#1


帮顶一下

#2


估计动态SQL中创建的临时表在语句运行过后会自动删除

这样试试
select * into tempdb..dbname from t where 1=2 

#3


引用 2 楼 wwwwb 的回复:
估计动态SQL中创建的临时表在语句运行过后会自动删除

这样试试
select * into tempdb..dbname from t where 1=2

临时表#tt是会话级别的,只有退出会话的时候才被删除。

#4


发现在执行第二个sql语句的时候,报‘#tt not found’的错误。
-----------------------------------------------------------
原因是在编译存储过程的时候,发现#tt这张临时表不存在。

你的ase版本是多少?ASE15.x有个参数可以解决此问题。 如果低于ase15.x的话,得换种思路了。 比如:如wwwwb所说的:select * into tempdb..dbname from t where 1=2 

#5


引用 4 楼 andkylee 的回复:
发现在执行第二个sql语句的时候,报‘#tt not found’的错误。
-----------------------------------------------------------
原因是在编译存储过程的时候,发现#tt这张临时表不存在。

你的ase版本是多少?ASE15.x有个参数可以解决此问题。 如果低于ase15.x的话,得换种思路了。 比如:如wwwwb所说的:s……


应该不是编译的问题吧。因为这是一个动态语句,编译器在编译期是不可能知道@sql字符串中是否有错误呀。
我的 ASE是15.5的

#6


引用 2 楼 wwwwb 的回复:
估计动态SQL中创建的临时表在语句运行过后会自动删除

这样试试
select * into tempdb..dbname from t where 1=2


试了一下这个方法,确实是可行的。估计tempdb是一个专门用来存放全局性临时表的空间。再次感谢你了。发现开始喜欢上CSDN了。。。

#7


测试一下 
set @sql='select * into #tt from t where 1=2'
execute (@sql)
select * from #tt

是否会报错

#8


引用 7 楼 wwwwa 的回复:
测试一下 
set @sql='select * into #tt from t where 1=2'
execute (@sql)
select * from #tt

是否会报错


这个肯定会报错了。
因为#tt是在运行期才会建立的,编译期是不会知道有#tt这个表的。所以select * from #tt肯定是编译通过不了的。

#9


测试一下 
set @sql='select * into #tt from t where 1=2
select * from #tt'
execute (@sql)

#1


帮顶一下

#2


估计动态SQL中创建的临时表在语句运行过后会自动删除

这样试试
select * into tempdb..dbname from t where 1=2 

#3


引用 2 楼 wwwwb 的回复:
估计动态SQL中创建的临时表在语句运行过后会自动删除

这样试试
select * into tempdb..dbname from t where 1=2

临时表#tt是会话级别的,只有退出会话的时候才被删除。

#4


发现在执行第二个sql语句的时候,报‘#tt not found’的错误。
-----------------------------------------------------------
原因是在编译存储过程的时候,发现#tt这张临时表不存在。

你的ase版本是多少?ASE15.x有个参数可以解决此问题。 如果低于ase15.x的话,得换种思路了。 比如:如wwwwb所说的:select * into tempdb..dbname from t where 1=2 

#5


引用 4 楼 andkylee 的回复:
发现在执行第二个sql语句的时候,报‘#tt not found’的错误。
-----------------------------------------------------------
原因是在编译存储过程的时候,发现#tt这张临时表不存在。

你的ase版本是多少?ASE15.x有个参数可以解决此问题。 如果低于ase15.x的话,得换种思路了。 比如:如wwwwb所说的:s……


应该不是编译的问题吧。因为这是一个动态语句,编译器在编译期是不可能知道@sql字符串中是否有错误呀。
我的 ASE是15.5的

#6


引用 2 楼 wwwwb 的回复:
估计动态SQL中创建的临时表在语句运行过后会自动删除

这样试试
select * into tempdb..dbname from t where 1=2


试了一下这个方法,确实是可行的。估计tempdb是一个专门用来存放全局性临时表的空间。再次感谢你了。发现开始喜欢上CSDN了。。。

#7


测试一下 
set @sql='select * into #tt from t where 1=2'
execute (@sql)
select * from #tt

是否会报错

#8


引用 7 楼 wwwwa 的回复:
测试一下 
set @sql='select * into #tt from t where 1=2'
execute (@sql)
select * from #tt

是否会报错


这个肯定会报错了。
因为#tt是在运行期才会建立的,编译期是不会知道有#tt这个表的。所以select * from #tt肯定是编译通过不了的。

#9


测试一下 
set @sql='select * into #tt from t where 1=2
select * from #tt'
execute (@sql)