【问题标题】:Accessing SQL table function columns from SELECT stored procedure从 SELECT 存储过程访问 SQL 表函数列
【发布时间】:2011-05-08 02:11:27
【问题描述】:

我有一个非常大的 SELECT 存储过程,它有多个返回列和多个 INNER JOINS 和 LEFT JOINS。我还有一个包含 10 列的表函数,表函数的结果集基于用户 ID。

我的问题是,如何将表函数合并到主 SELECT 存储过程中,并能够根据用户 ID 从表函数返回列。

主存储过程:

SELECT     
      dbo.WebPersonalInfo.UserID, 
      dbo.WebPersonalInfo.FirstName, 
      dbo.WebPersonalInfo.MiddleInitial, 
      dbo.WebPersonalInfo.LastName,
      dbo.WebProgramParticipants.ParticipantID, 
      dbo.WebProgramParticipants.ProgramCode, 
FROM  dbo.WebProgramParticipants INNER JOIN
      dbo.WebPersonalInfo ON dbo.WebProgramParticipants.UserID = dbo.WebPersonalInfo.UserID 
WHERE     (dbo.WebProgramParticipants.ProgramCode = @programcode) 
ORDER BY dbo.WebPersonalInfo.LastName, dbo.WebPersonalInfo.FirstName

表格功能:

SELECT 
        ST1.SKILL_SET_ID AS SET1, SS1.SET_NAME AS NAME1, ST1.SKILL_SET_RATING AS R1,
        ST2.SKILL_SET_ID AS SET2, SS2.SET_NAME AS NAME2, ST2.SKILL_SET_RATING AS R2,
        ST3.SKILL_SET_ID AS SET3, SS3.SET_NAME AS NAME3, ST3.SKILL_SET_RATING AS R3,
        ST4.SKILL_SET_ID AS SET4, SS4.SET_NAME AS NAME4, ST4.SKILL_SET_RATING AS R4,
        ST5.SKILL_SET_ID AS SET5, ST5.SKILL_SET_OPTIONAL AS NAME5, ST5.SKILL_SET_RATING AS R5,
        ST6.SKILL_SET_ID AS SET6, ST6.SKILL_SET_OPTIONAL AS NAME6, ST6.SKILL_SET_RATING AS R6,
        ST7.SKILL_SET_ID AS SET7, ST7.SKILL_SET_OPTIONAL AS NAME7, ST7.SKILL_SET_RATING AS R7,
        CM.COMMENTS
    FROM IPAM_RIPS_SKILL_SET_PARTICIPANT_RATING_HDR HT
    LEFT JOIN IPAM_RIPS_SKILL_SET_PARTICIPANT_RATING_DTL ST1
        ON HT.ID = ST1.HDR_ID and st1.SKILL_SET_ID = 1
    INNER JOIN IPAM_RIPS_SKILL_SETS SS1
        ON ST1.SKILL_SET_ID = SS1.ID
    LEFT JOIN IPAM_RIPS_SKILL_SET_PARTICIPANT_RATING_DTL ST2
        ON HT.ID = ST2.HDR_ID and st2.SKILL_SET_ID = 2
    INNER JOIN IPAM_RIPS_SKILL_SETS SS2
        ON ST2.SKILL_SET_ID = SS2.ID
    LEFT JOIN IPAM_RIPS_SKILL_SET_PARTICIPANT_RATING_DTL ST3
        ON HT.ID = ST3.HDR_ID and st3.SKILL_SET_ID = 3
    INNER JOIN IPAM_RIPS_SKILL_SETS SS3
        ON ST3.SKILL_SET_ID = SS3.ID
    LEFT JOIN IPAM_RIPS_SKILL_SET_PARTICIPANT_RATING_DTL ST4
        ON HT.ID = ST4.HDR_ID and st4.SKILL_SET_ID = 4
    INNER JOIN IPAM_RIPS_SKILL_SETS SS4
        ON ST4.SKILL_SET_ID = SS4.ID
    LEFT JOIN IPAM_RIPS_SKILL_SET_PARTICIPANT_RATING_DTL ST5
        ON HT.ID = ST5.HDR_ID and st5.SKILL_SET_ID = 5
    INNER JOIN IPAM_RIPS_SKILL_SETS SS5
        ON ST5.SKILL_SET_ID = SS5.ID
    LEFT JOIN IPAM_RIPS_SKILL_SET_PARTICIPANT_RATING_DTL ST6
        ON HT.ID = ST6.HDR_ID and st6.SKILL_SET_ID = 10
    INNER JOIN IPAM_RIPS_SKILL_SETS SS6
        ON ST6.SKILL_SET_ID = SS6.ID
    LEFT JOIN IPAM_RIPS_SKILL_SET_PARTICIPANT_RATING_DTL ST7
        ON HT.ID = ST7.HDR_ID and st7.SKILL_SET_ID = 11
    INNER JOIN IPAM_RIPS_SKILL_SETS SS7
        ON ST7.SKILL_SET_ID = SS7.ID
    INNER JOIN IPAM_RIPS_SKILL_SET_PARTICIPANT_RATING_COMMENTS CM
        ON HT.ID = CM.HDR_ID
    WHERE HT.PARTICIPANT_ID = @PARTICIPANT_ID
    GROUP BY PARTICIPANT_ID, ST1.SKILL_SET_ID, SS1.SET_NAME, ST1.SKILL_SET_RATING, ST2.SKILL_SET_ID, SS2.SET_NAME, ST2.SKILL_SET_RATING, ST3.SKILL_SET_ID, SS3.SET_NAME, ST3.SKILL_SET_RATING, ST4.SKILL_SET_ID, SS4.SET_NAME, ST4.SKILL_SET_RATING, ST5.SKILL_SET_ID, ST5.SKILL_SET_OPTIONAL, ST5.SKILL_SET_RATING, ST6.SKILL_SET_ID, ST6.SKILL_SET_OPTIONAL, ST6.SKILL_SET_RATING, ST7.SKILL_SET_ID, ST7.SKILL_SET_OPTIONAL, ST7.SKILL_SET_RATING, CM.COMMENTS

【问题讨论】:

  • 示例代码将帮助我们为您提供帮助。
  • 我会展示主存储过程的代码,但它非常庞大。
  • 顺便说一句,你的函数中的左连接在它们的编写方式上毫无意义。试试看。

标签: sql sql-server sql-server-2005 tsql stored-procedures


【解决方案1】:

您可以使用outer applyinner apply 来像使用普通函数表一样使用函数表:

select  *
from    users u
outer apply
        dbo.fn_YourFunction(u.id) yf

这将返回函数中的所有列。

【讨论】:

  • 我添加了一个精简版的存储过程和表函数
  • @mattgcon:那么,在查询中添加outer apply dbo.YourFunction(WebPersonalInfo.UserID)
  • 我尝试在所有连接之后添加它,但我得到一个“关键字'outer'附近的语法不正确”,我所做的只是在最后一个内部连接之后添加
  • 您的数据库是否处于 2000 兼容模式? (在数据库的属性中可见)
  • 您使用的是什么版本的 SQL Server? (没关系——错过了 2005 年的标签)
【解决方案2】:

Andomar 的回答是正确的,但是......您是否考虑过只使用 VIEW 来代替?简单得多,而且几乎可以肯定更快。

取函数,去掉WHERE子句,将PARTICIPANT_ID加入SELECT列表;那是你的看法。然后,您可以在 Participant_ID 上加入它,就像它是一个表一样。

【讨论】:

  • 好的,如果我从表函数中取出确切的代码,我将如何引用主存储过程中的列
  • 哦等等,这不利于记忆。这将被称为大约。跑了230次
  • 取函数,去掉WHERE子句,将PARTICIPANT_ID加入SELECT列表;那是你的看法。然后,您可以在 Participant_ID 上加入它,就像它是一个表一样。如果您需要更多信息,请告诉我,我会在单独的答案中提供。
【解决方案3】:

不知道你到底在问什么,但是稍微了解一下...

您可以加入表值函数:

SELECT *
FROM existing tables and joins
LEFT JOIN tvf(@userid /* param to SP */)
    ON whatever

您还可以将表值函数应用于行:

SELECT *
FROM existing tables and joins
OUTER APPLY tvf(userid /* column from above joins */)

【讨论】:

    【解决方案4】:

    您可以使用SELECT * FROM yourfunction() 从 sql 函数中检索数据。因此,也许您可​​以将 UserID 上的一些 JOINS 与 yourfuncition() 一起用于您的主 SELECT,如上所示。

    您需要更具体才能获得更好的答案。

    【讨论】:

      猜你喜欢
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多