如何存储已执行过程中的临时表?

Posted

技术标签:

【中文标题】如何存储已执行过程中的临时表?【英文标题】:How can I store a temporary table from an executed procedure? 【发布时间】:2019-03-20 23:32:25 【问题描述】:

我有以下代码:

SELECT @Name = [TrigTable] 
FROM [dbo].[setdevelopmentjob] 
WHERE [TrigTable] IS NOT NULL

PRINT @Name

SET @sql = 'SELECT * FROM ' + @Name;

#TriggerTable = EXEC sp_executesql @sql;

SELECT * FROM #TriggerTable

显然#TriggerTable = Exec sp_executesql @sql这行语法不正确,但它显示了我正在尝试做的事情。列是可变的,这意味着我不能只声明一个表变量。如何将此执行过程的输出传递给#TriggerTable

【问题讨论】:

你可能想看看这个:***.com/questions/7246276/… 使用 OPENROWSET,将存储过程的结果视为表表达式的最佳方式 不完全。我已经尝试过这些方法。当您运行 sp_executesql 时,您无法检索从查询生成的任何临时表 这里列出的任何答案对您没有帮助吗? ***.com/questions/653714/… 【参考方案1】:

您可以使用 Select * into 方法将数据存储在全局临时表 (##) 中,并存储在 #temp 表中,您必须首先创建表,我在使用动态 sql 时知道这一点但是您当然可以这样做在运行时,但您仍然可能需要一些物理表来访问它。

create table testtmp (id int, namen varchar(15)) 

--inserting the data into physical table 
insert into testtmp (id, namen)

select 1 as ID, 'XYZ' as namen union all
select 2 as ID, 'ABC' as namen union all
select 3 as ID, 'DIG' as namen

create table #temp (ID int) 

declare @sql nvarchar(max) = 'select ID from testtmp' 
insert into #temp exec sp_executesql @sql 

select * from #temp 

Gives you this output: 

 ID 
  1 
  2 
  3 

使用全局临时表,您可以轻松完成,无需创建任何表,您可以根据需要指定列名。

 declare @sql nvarchar(max) = 'select * into ##Gloabltmptest from testtmp' 
 exec sp_executesql @sql 

 select * from ##Gloabltmptest 

输出:

 ID  namen
 1  XYZ
 2  ABC
 3  DIG

还添加了表变量,类似于#temp 表。

declare @table table (IDtab int, nametab varchar(15)) 

declare @sql nvarchar(max) = 'select * from testtmp' 
insert into @table exec sp_executesql @sql 

select * from @table 

【讨论】:

很高兴它帮助了@JoshuaJack :) 如果您想查看,我也添加了表变量,它与您的 #temp 表方法相同。

以上是关于如何存储已执行过程中的临时表?的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver 2008 关于存储过程中的临时表。

如何解决执行存储过程导致的内存不足错误?

如何在打开游标之前在存储过程中创建一个临时表?

如何执行存储过程

创建临时表并使用存储过程将数据加载到其中

oracle 怎么在存储过程中创建一个临时表,在里面插入数据,再查找这个临时表的所有数据,最后drop这个表。