是否可以在SQL Server 2008中使用存储过程作为子查询?

pyo*_*yon 19 sql-server stored-procedures subquery

我有两个存储过程,其中一个返回付款清单,而另一个返回这些付款的摘要,按货币分组.现在,我有一个重复的查询:返回付款清单的存储过程的主要查询是存储过程的子查询,它返回按货币付款的摘要.我想通过使返回付款列表的存储过程成为存储过程的子查询来返回按货币付款的摘要,从而消除这种双重性.这可能在SQL Server 2008中吗?

Ric*_*iwi 18

最好将第一个proc转换为TABLE-VALUED函数.如果它涉及多个语句,则需要首先定义返回表结构并填充它.

样品:

CREATE proc getRecords @t char(1)
as
set nocouut on;
-- other statements --
-- final select
select * from master..spt_values where type = @t
GO
Run Code Online (Sandbox Code Playgroud)

- 成为 -

CREATE FUNCTION fn_getRecords(@t char(1))
returns @output table(
    name sysname,
    number int,
    type char(1),
    low int,
    high int,
    status int) as
begin
-- other statements --
-- final select
insert @output
select * from master..spt_values where type = @t
return
end;
Run Code Online (Sandbox Code Playgroud)

但是,如果它是直接选择(或可以写成单个语句),那么您可以使用INLINE tvf表单,这是高度优化的

CREATE FUNCTION fn2_getRecords(@t char(1))
returns table as return
-- **NO** other statements; single statement table --
select * from master..spt_values where type = @t
Run Code Online (Sandbox Code Playgroud)

第二个proc只是从第一个proc中选择

create proc getRecordsByStatus @t char(1)
as
select status, COUNT(*) CountRows from dbo.fn2_getRecords(@t)
group by status
Run Code Online (Sandbox Code Playgroud)

而你以前在哪里打电话

EXEC firstProc @param
Run Code Online (Sandbox Code Playgroud)

要获得结果,您现在可以从中进行选择

SELECT * FROM firstProc(@param)
Run Code Online (Sandbox Code Playgroud)


Mik*_*son 6

您可以从临时表中捕获存储过程的输出,然后在主查询中使用该表.

捕获将列ID和名称返回到表变量的存储过程的输出.

declare @T table (ID int, Name nvarchar(50))

insert into @T
exec StoredProcedure
Run Code Online (Sandbox Code Playgroud)

  • 我希望有一个“EXEC INTO #tmp”:-) (3认同)

Jef*_*ffO 6

将存储过程的结果插入表变量或临时表中就可以了.

如果您尝试将SQL Server中的代码从一个查询重用到下一个查询,那么您可以更灵活地使用表函数.如果您不需要传递参数或使用任何类型的流控制逻辑,那么视图就可以了.这些可以像任何其他函数,过程,视图或t-sql语句中的表一样使用.