将SQL存储过程值插入另一个存储过程

时间:2011-12-09 17:19:02

标签: sql stored-procedures

我有一个大型存储过程,它返回一个人的记录,我需要返回四个字段,以返回非常具体的值。我有另一个执行此特定操作的存储过程。

小存储过程如下:

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个数据项放入从大型存储过程返回的数据集中的各自列?

3 个答案:

答案 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的参数。