如何存储已执行过程中的临时表?
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 表方法相同。以上是关于如何存储已执行过程中的临时表?的主要内容,如果未能解决你的问题,请参考以下文章