我有一个存储过程,它可以在输出中返回各种字段名。像这样:
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;