====================静态语句创建临时表=========================
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
这样试试
select * into tempdb..dbname from t where 1=2
#3
临时表#tt是会话级别的,只有退出会话的时候才被删除。
#4
发现在执行第二个sql语句的时候,报‘#tt not found’的错误。
-----------------------------------------------------------
原因是在编译存储过程的时候,发现#tt这张临时表不存在。
你的ase版本是多少?ASE15.x有个参数可以解决此问题。 如果低于ase15.x的话,得换种思路了。 比如:如wwwwb所说的:select * into tempdb..dbname from t where 1=2
-----------------------------------------------------------
原因是在编译存储过程的时候,发现#tt这张临时表不存在。
你的ase版本是多少?ASE15.x有个参数可以解决此问题。 如果低于ase15.x的话,得换种思路了。 比如:如wwwwb所说的:select * into tempdb..dbname from t where 1=2
#5
应该不是编译的问题吧。因为这是一个动态语句,编译器在编译期是不可能知道@sql字符串中是否有错误呀。
我的 ASE是15.5的
#6
试了一下这个方法,确实是可行的。估计tempdb是一个专门用来存放全局性临时表的空间。再次感谢你了。发现开始喜欢上CSDN了。。。
#7
测试一下
set @sql='select * into #tt from t where 1=2'
execute (@sql)
select * from #tt
是否会报错
set @sql='select * into #tt from t where 1=2'
execute (@sql)
select * from #tt
是否会报错
#8
这个肯定会报错了。
因为#tt是在运行期才会建立的,编译期是不会知道有#tt这个表的。所以select * from #tt肯定是编译通过不了的。
#9
测试一下
set @sql='select * into #tt from t where 1=2
select * from #tt'
execute (@sql)
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
这样试试
select * into tempdb..dbname from t where 1=2
#3
临时表#tt是会话级别的,只有退出会话的时候才被删除。
#4
发现在执行第二个sql语句的时候,报‘#tt not found’的错误。
-----------------------------------------------------------
原因是在编译存储过程的时候,发现#tt这张临时表不存在。
你的ase版本是多少?ASE15.x有个参数可以解决此问题。 如果低于ase15.x的话,得换种思路了。 比如:如wwwwb所说的:select * into tempdb..dbname from t where 1=2
-----------------------------------------------------------
原因是在编译存储过程的时候,发现#tt这张临时表不存在。
你的ase版本是多少?ASE15.x有个参数可以解决此问题。 如果低于ase15.x的话,得换种思路了。 比如:如wwwwb所说的:select * into tempdb..dbname from t where 1=2
#5
应该不是编译的问题吧。因为这是一个动态语句,编译器在编译期是不可能知道@sql字符串中是否有错误呀。
我的 ASE是15.5的
#6
试了一下这个方法,确实是可行的。估计tempdb是一个专门用来存放全局性临时表的空间。再次感谢你了。发现开始喜欢上CSDN了。。。
#7
测试一下
set @sql='select * into #tt from t where 1=2'
execute (@sql)
select * from #tt
是否会报错
set @sql='select * into #tt from t where 1=2'
execute (@sql)
select * from #tt
是否会报错
#8
这个肯定会报错了。
因为#tt是在运行期才会建立的,编译期是不会知道有#tt这个表的。所以select * from #tt肯定是编译通过不了的。
#9
测试一下
set @sql='select * into #tt from t where 1=2
select * from #tt'
execute (@sql)
set @sql='select * into #tt from t where 1=2
select * from #tt'
execute (@sql)