我有一个大型存储过程,它返回一个人的记录,我需要返回四个字段,以返回非常具体的值。我有另一个执行此特定操作的存储过程。
小存储过程如下:
SELECT TOP 1
wea.field,
wea.degree,
wea.degreeyear,
wpp.ProgramCategory
FROM dbo.webeventaffiliation wea
LEFT JOIN dbo.WebProgramParticipants wpp
ON
wea.userid = wpp.UserID AND
wea.eventid = wpp.eventid
INNER JOIN dbo.WebProgramCategoryDescriptions wpcd
ON
wpcd.ProgramCategory = wpp.ProgramCategory
WHERE wea.UserID = @UserID
ORDER BY wea.datelastmodified DESC
大型存储过程示例返回数据:
Name: XXXXX
Address: XXXXX
Field: [small stored procedure value]
Degree: [small stored procedure value]
DegreeYear: [small stored procedure value]
ProgramCategory: [small stored procedure value]
我的问题是如何将此存储过程中的4个数据项放入从大型存储过程返回的数据集中的各自列?
答案 0 :(得分:2)
使用表值函数而不是存储过程可能会有所帮助。您可以像桌子一样使用TVF,例如:
SELECT
COLUMNS_NAMES
FROM
TVF(PARAMS)
答案 1 :(得分:1)
由于您的小存储过程不写任何内容,您可以将其写为表值函数。
然后,您可以使用APPLY将该函数应用于整个数据集。
(表示INLINE(非多语句)的表值函数然后被宏大似地解释为非常有效地执行。这非常适合您的描述,因为函数只是一个SELECT语句。)
功能:
CREATE FUNCTION dbo.your_function(@user_id AS INT)
RETURNS TABLE
AS
RETURN
<your query>
大SP中查询中使用的函数:
SELECT
...,
user_detail.field,
user_detail.degree,
user_detail.degreeyear,
user_detail.programcategory
FROM
...
CROSS APPLY
dbo.your_function(some_table.user_id) AS user_detail
一般情况下,我使用函数来封装查询,并且只在...存储过程中将它们包装起来
1)我需要写数据。 (功能不能INSERT,UPDATE或DELETE)
2)我想创建一个类似API的客户端应用程序接口。
答案 2 :(得分:0)
由于您只获得了包含四个值的一行,因此您可以使用OUTPUT
个参数:
EXECUTE SomeSmallerProcedure
@field OUTPUT, @degree OUTPUT, @degreeyear OUTPUT, @ProgramCategory OUTPUT;
上面列出的程序将更改为:
ALTER PROCEDURE SomeSmallerProcedure
@field varchar(255) OUTPUT,
@degree varchar(255) OUTPUT,
@degreeyear varchar(255) OUTPUT,
@ProgramCategory varchar(255) OUTPUT
AS BEGIN SET NOCOUNT ON;
SELECT TOP 1
@field = wea.field,
@degree = wea.degree,
@degreeyear = wea.degreeyear,
@ProgramCategory = wpp.ProgramCategory
-- ... rest as before
上述程序的签名必须明确包含OUTPUT
的参数。