我有2个程序proc_Data
,proc_FetchData
。
我在proc_Data
内拨打proc_FetchData
。 proc_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 - 有什么方法可以实现这一目标吗?提前致谢。
答案 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值而不同。