存储过程中,如何动态创建临时表

时间:2022-04-28 14:05:35
存储过程中,如何动态创建临时表
并且这个临时表还要被其他存储过程调用
这个临时表的名字是程序随机创建的

比如如何改写下面的sql语句为存储过程:
select ... into #t_1 from ... where ...

select ...into #t_2 from .. 

select ... from #t_1 ,#t_2 ...

15 个解决方案

#1


急!!

#2


--要用全局临时表才行

create proc up_createtmptable(@id int)
as
begin
declare @sql varchar(8000)
select @sql=''
select @sql='select * into ##t_'+cast(@id as varchar(10))+' from tablename'
exec(@sql)
end

exec up_createtmptable 12

#3


这样写,还是不行啊
报错,说不存在这样的##全局临时表
谁能详细说明一下啊

#4


这个是可以的

注意在后面加个go

create proc up_createtmptable(@id int)
as
begin
declare @sql varchar(8000)
select @sql=''
select @sql='select * into ##t_'+cast(@id as varchar(10))+' from sysobjects'
exec(@sql)
end
go

exec up_createtmptable 12

drop table ##t_12
drop proc up_createtmptable

#5


CREATE     PROCEDURE [dbo].[sp_getDdkxib_22] 
@chPayUse_30 varchar(8000),
@chPayUse_31 varchar(8000),
                        @temp_3 varchar(30),      
@temp_1 varchar(30),
@beginTime varchar(20),
@endTime varchar(20)
AS
begin
declare @sql varchar(8000)
select @sql=''
select @sql= 'select c.ChUnitCode, c.chUnitBrief, c.chunitqualitycode, ' +
        ' sum(case when (c.chZHType = ''20'' and a.chPayUse in(' + @chPayUse_30 +
        ' )) then a.decPayAmount else 0 end) as dsjzcddk, ' +
        ' sum(case when (c.chZHType = ''30'' and a.chPayUse in(' + @chPayUse_31 +
        ' )) then a.decPayAmount else 0 end) as tsjgcddk ' +
        ' into ' + @temp_3 +
        ' from ES_LSZ a, ES_YHZHB b, ' + @temp_1  + ' c ' +
        ' where a.chPayAccount = b.chBankAccount ' +
        ' and a.chStatus = ''8'' ' + 
        ' and b.ChUnitCode = ''1000000'' ' + 
        ' and a.chRecAccount = c.chBankAccount ' +             
        ' and (convert(char(10),a.dDate,120) between' + @beginTime + ' and ' +  @endTime + ') ' +
        ' group by c.chunitqualitycode, c.chUnitBrief, c.ChUnitCode ' +
        ' order by c.chunitqualitycode, c.ChUnitCode'

exec(@sql)
end
GO


其中含temp的是临时表,在程序中随机得到,已经加了##。
执行到这个存储过程的时候,会报错:temp_1的临时变量无效;
09:12:01,572 INFO  [STDOUT] execute catch java.sql.SQLException: [TXT-WY7UVCS
Z]对象名 '##temp_Dd14760210' 无效。

而temp_1指的临时表是在另外一个,同这个存储过程像类似的存储过程中创建的。先于这个存储过程创建的。

#6


基本看了一下,其实在用临时表的时候,最好加以判断:
-- Check the #WeekCharge table whether it existe
If Object_id('TempDB..#WeekCharge') Is Not NULL 
INSERT INTO #WeekCharge(OldWeekChargeID,WeekChargeID) 
VALUES(@WeekChargeID,@NewWeekChargeID)
ELSE
SELECT OldWeekChargeID=@WeekChargeID,WeekChargeID 
INTO #WeekCharge 
FROM WeekCharge
WHERE WeekChargeID=@NewWeekChargeID

#7


请问怎么解决存储过程中临时表的调用问题,临时表a在存储过程t1中创建,a又会在后面的存储过程被调用
怎么解决

#8


放到存储过程中完全可以的.

#9


不行啊
说临时表不存在
临时表的名字是在程序中创建,临时表是在存储过程中创建
临时表会在其他存储过程中被调用

#10


没办法,没有用过,不过可以将存储过程返回出来

insert into #TableName1
exec ProcName1
但是要参数一样

#11


可以用全局的虚拟表##temp

#12


用了##,下面就是后台的提示:
      对象名 '##temp_Jb24240701' 无效。

其中Jb24240701是在程序中随机得来的。

#13


有人能指点一下吗?

#14


加前缀没?

Tempdb..##temp_Jb24240701

#15


存储过程中,如何动态创建临时表
并且这个临时表还要被其他存储过程调用
这个临时表的名字是程序随机创建的

----------------------------------
sorry,昨天没有看仔细,在一个存储过程中动态创建的表,在本次存储过程中调用完毕后会自动的销毁,如果实在要用,就不要用临时表了,就用实际表就好了。就是要用完后drop

#1


急!!

#2


--要用全局临时表才行

create proc up_createtmptable(@id int)
as
begin
declare @sql varchar(8000)
select @sql=''
select @sql='select * into ##t_'+cast(@id as varchar(10))+' from tablename'
exec(@sql)
end

exec up_createtmptable 12

#3


这样写,还是不行啊
报错,说不存在这样的##全局临时表
谁能详细说明一下啊

#4


这个是可以的

注意在后面加个go

create proc up_createtmptable(@id int)
as
begin
declare @sql varchar(8000)
select @sql=''
select @sql='select * into ##t_'+cast(@id as varchar(10))+' from sysobjects'
exec(@sql)
end
go

exec up_createtmptable 12

drop table ##t_12
drop proc up_createtmptable

#5


CREATE     PROCEDURE [dbo].[sp_getDdkxib_22] 
@chPayUse_30 varchar(8000),
@chPayUse_31 varchar(8000),
                        @temp_3 varchar(30),      
@temp_1 varchar(30),
@beginTime varchar(20),
@endTime varchar(20)
AS
begin
declare @sql varchar(8000)
select @sql=''
select @sql= 'select c.ChUnitCode, c.chUnitBrief, c.chunitqualitycode, ' +
        ' sum(case when (c.chZHType = ''20'' and a.chPayUse in(' + @chPayUse_30 +
        ' )) then a.decPayAmount else 0 end) as dsjzcddk, ' +
        ' sum(case when (c.chZHType = ''30'' and a.chPayUse in(' + @chPayUse_31 +
        ' )) then a.decPayAmount else 0 end) as tsjgcddk ' +
        ' into ' + @temp_3 +
        ' from ES_LSZ a, ES_YHZHB b, ' + @temp_1  + ' c ' +
        ' where a.chPayAccount = b.chBankAccount ' +
        ' and a.chStatus = ''8'' ' + 
        ' and b.ChUnitCode = ''1000000'' ' + 
        ' and a.chRecAccount = c.chBankAccount ' +             
        ' and (convert(char(10),a.dDate,120) between' + @beginTime + ' and ' +  @endTime + ') ' +
        ' group by c.chunitqualitycode, c.chUnitBrief, c.ChUnitCode ' +
        ' order by c.chunitqualitycode, c.ChUnitCode'

exec(@sql)
end
GO


其中含temp的是临时表,在程序中随机得到,已经加了##。
执行到这个存储过程的时候,会报错:temp_1的临时变量无效;
09:12:01,572 INFO  [STDOUT] execute catch java.sql.SQLException: [TXT-WY7UVCS
Z]对象名 '##temp_Dd14760210' 无效。

而temp_1指的临时表是在另外一个,同这个存储过程像类似的存储过程中创建的。先于这个存储过程创建的。

#6


基本看了一下,其实在用临时表的时候,最好加以判断:
-- Check the #WeekCharge table whether it existe
If Object_id('TempDB..#WeekCharge') Is Not NULL 
INSERT INTO #WeekCharge(OldWeekChargeID,WeekChargeID) 
VALUES(@WeekChargeID,@NewWeekChargeID)
ELSE
SELECT OldWeekChargeID=@WeekChargeID,WeekChargeID 
INTO #WeekCharge 
FROM WeekCharge
WHERE WeekChargeID=@NewWeekChargeID

#7


请问怎么解决存储过程中临时表的调用问题,临时表a在存储过程t1中创建,a又会在后面的存储过程被调用
怎么解决

#8


放到存储过程中完全可以的.

#9


不行啊
说临时表不存在
临时表的名字是在程序中创建,临时表是在存储过程中创建
临时表会在其他存储过程中被调用

#10


没办法,没有用过,不过可以将存储过程返回出来

insert into #TableName1
exec ProcName1
但是要参数一样

#11


可以用全局的虚拟表##temp

#12


用了##,下面就是后台的提示:
      对象名 '##temp_Jb24240701' 无效。

其中Jb24240701是在程序中随机得来的。

#13


有人能指点一下吗?

#14


加前缀没?

Tempdb..##temp_Jb24240701

#15


存储过程中,如何动态创建临时表
并且这个临时表还要被其他存储过程调用
这个临时表的名字是程序随机创建的

----------------------------------
sorry,昨天没有看仔细,在一个存储过程中动态创建的表,在本次存储过程中调用完毕后会自动的销毁,如果实在要用,就不要用临时表了,就用实际表就好了。就是要用完后drop