从具有动态列的存储过程插入到#temp_table中



我有一个存储过程,它可以在输出中返回各种字段名。像这样:

create or alter procedure dbo.my_prc (@return_format as int ) as
create table #all_data (id int ,chr varchar(10))
insert into #all_data
values (1,'a')
,(2,'b')
,(3,'c')
--return id -> id_2 only
if @return_format = 1
select id * 2 as 'id_2' from #all_data
--return chr -> chrq only
if @return_format = 2
select chr + '?' as 'chrq' from #all_data
--return everything
if @return_format = 3
select * from #all_data

以下是可能的输出:

exec my_prc @return_format = 1 --id_2
exec my_prc @return_format = 2 --chrq
exec my_prc @return_format = 3 --everything

我如何动态地创建一个#temp_table(或1-3的一组临时表)来捕获我的字段名和数据?

这显然是行不通的,但是我在想:

/*
exec my_prc @return_format = 1 into #temp_table
--or maybe
select top 0 from (exec my_prc @return_format = 1) into #temp_table --create a #temp_table with the field names
insert into #temp_table exec my_prc @return_format = 1
*/

对于更多上下文,我试图避免简单地声明一个静态的#temp_table并像这样插入。我不想陷入困境,但这对我来说可能不是一个好的选择。

create table #temp_table (id int ,chr varchar(10))
insert into #temp_table
exec my_prc @return_format = 3

这是一个解决方案,写入数据库,然后从新创建的表

创建一个#temp_table

存储过程如下所示

create or alter procedure dbo.my_prc (@return_format as int ) as
create table #all_data (id int ,chr varchar(10))
insert into #all_data
values (1,'a')
,(2,'b')
,(3,'c')
drop table if exists dbo.output_table --drop so that you can reset the field names
--return id -> id_2 only
if @return_format = 1
select id * 2 as 'id_2' into dbo.output_table from #all_data
--return chr -> chrq only
if @return_format = 2
select chr + '?' as 'chrq' into dbo.output_table from #all_data
--return everything
if @return_format = 3
select * into dbo.output_table from #all_data
select * from dbo.output_table --if you still need to see the output in the SP

然后在dbo.output_table上创建#temp_table

select * into #temp_table from dbo.output_table

无论您为@return_format选择哪个值,dbo.output_table都将具有这些字段

您尝试过使用动态SQL吗?

这是一种将SQL写入字符串然后执行它的方法。

v_sql = "create table " + v_table_name + for loop with columns... ";
execute immediate v_sql;

相关内容

  • 没有找到相关文章

最新更新