当过程在SQL Server 2014中返回多个表时,将第一个表插入临时表

时间:2018-01-25 12:22:03

标签: sql-server sql-server-2014

我有2个程序proc_Dataproc_FetchData

我在proc_Data内拨打proc_FetchDataproc_Data返回2个表。我想在第二个过程中只将第一个表插入临时表并进一步使用它。

问题是我无法以任何方式更改proc_Data,因为这是我们的应用程序的各个部分中使用的非常古老的过程。

参考示例代码

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

我正在使用SQL Server 2014 - 有什么方法可以实现这一目标吗?提前致谢。

3 个答案:

答案 0 :(得分:1)

你不能这样做,你可以将你的第一个SP分成2并在你的第二个SP中调用它,比如,

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

答案 1 :(得分:0)

要仅插入第一个表,您可以使用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

如果您需要访问所有结果集,则需要使用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 :(得分:0)

我建议您为过程添加一个带有默认值的新输入参数,并返回取决于其值的不同数据集。

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

执行此操作后,您将能够在任何旧查询中使用proc_Data而无需更改,而如果需要,其输出将根据不同的@Mode值而不同。