Insert first table into temp table when procedure returns multiple tables in SQL Server 2014

我们两清 提交于 2019-12-11 18:46:03

问题


I have 2 procedures proc_Data, proc_FetchData.

I'm calling proc_Data from within proc_FetchData. proc_Data returns 2 tables. I want to insert only the first table into a temp table in my second procedure and use it further.

The problem is I cannot change proc_Data in any way as this is a very old procedure used in various parts of our application.

Sample code for reference

create procedure proc_Data
As
Begin
    select 'Apples'
    select 'Oranges','Grapes'
end

create procedure proc_FetchData
As
Begin
    create table #temp(Data varchar(30))

    insert into #temp
        exec Test_proc

    select * from #temp
end

I'm using SQL Server 2014 - is there any way to achieve this? Thanks in advance.


回答1:


To insert only the first table you can use OPENROWSET.

create procedure proc_FetchData
As
Begin    
    declare @userData TABLE(Data NVARCHAR(30))
    INSERT INTO @userData
    SELECT * FROMOPENROWSET('SQLNCLI','Server=[server];Trusted_Connection=yes;','EXEC [database name].dbo.proc_Data')    
select * from @userData
end

If you need to access all resultsets you will need to use SQLCLR proc: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/da5328a7-5dab-44b3-b2b1-4a8d6d7798b2/insert-into-table-one-or-multiple-result-sets-from-stored-procedure?forum=transactsql




回答2:


You cant do it that way, you can split your first SP into 2 and call it in your second SP, like,

create procedure proc_Data1
As
Begin
    select 'Apples'
end

GO
create procedure proc_Data2
As
Begin
    select 'Oranges','Grapes'
end

GO
ALTER procedure proc_FetchData
As
Begin
    create table #temp(
        Data  varchar(30)
    )
    insert into #temp
    exec proc_Data1

    select * from #temp

end



回答3:


I suggest you add a new input parameter with a default value to your procedure and return different datasets depended on its value.

ALTER procedure proc_Data
    @Mode   INT = 0
As
Begin
    IF @Mode = 0 BEGIN
        select 'Apples'
        select 'Oranges','Grapes'
    END
    ELSE BEGIN
        select 'Apples'
    END

end

go

ALTER procedure proc_FetchData
As
Begin
    create table #temp(Data varchar(30))

    insert into #temp
        exec proc_Data @Mode = 1

    select * from #temp
end

After doing so, you will be able to use your proc_Data in any old queries without changes, whereas its output will be different with different @Mode values if you need.



来源:https://stackoverflow.com/questions/48442793/insert-first-table-into-temp-table-when-procedure-returns-multiple-tables-in-sql

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!