【问题标题】:Insert SQL stored procedure values into another stored procedure将 SQL 存储过程值插入另一个存储过程
【发布时间】:2011-12-09 17:19:02
【问题描述】:

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

小存储过程如下:

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

【问题讨论】:

  • 不,第二个存储过程将包含这四列的数据,而不是大型存储过程。我在想我可以从大型存储过程中执行 EXEC 调用,但不知道该怎么做。

标签: sql stored-procedures


【解决方案1】:

使用表值函数而不是存储过程可能会有所帮助。您将能够像使用表格一样使用 TVF,即:

SELECT
  COLUMNS_NAMES
FROM
  TVF(PARAMS)

【讨论】:

    【解决方案2】:

    由于您的小型存储过程不写入任何内容,您可以将其编写为表值函数。

    然后您可以使用 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)我需要写数据。 (函数不能插入、更新或删除)
    2) 我想为客户端应用程序创建一个类似于 API 的接口。

    【讨论】:

      【解决方案3】:

      由于您只得到一行有四个值,您可以使用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 的这些参数。

      【讨论】:

      • 好吧是有道理的,不过我将如何在更大的过程中设置它。我以为我可以将 EXEC somesmallerprocedure(x,x,x,x) AS 字段放在较大的过程中,但这看起来不起作用。
      • 在较大的过程中,您将调用较小的一次,就像我在第一个代码 sn-p 中所做的那样。
      • 对于我传递用户 ID 的较小过程,在我做出您建议的更改后,我尝试了您的建议,但它告诉我指定的参数太多
      • 您必须更改您正在调用的过程的参数。你不能只传入任意参数。
      • 我正在使用声明语句在执行语句之前声明字段、学位、学位年份和程序类别。然而,智能感知仅显示该较小存储过程的一个参数
      猜你喜欢
      • 2013-03-08
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      • 1970-01-01
      相关资源
      最近更新 更多