【问题标题】:How to use a table valued function in select clause?如何在选择子句中使用表值函数?
【发布时间】:2020-01-25 12:50:01
【问题描述】:

我有一个带有字符串列 (rawData) 的 tableA,并且我有一个可以运行的表值函数 (functionA)将接受 'rawData' 作为输入参数并返回五个新字段。 那个函数会做什么? - 这将做一些字符串操作并将一些数据分成五个值

我的动机是选择该字符串列 (rawData) 并传递该表值函数 (functionA) 并为 tableA

示例如下:

Select 
    (Select * from function (rawData))
from tableA

我的期望是我应该从 functionA 以及 rawData 中获取具有该值的每一行,但我遇到了以下错误:

选择列表中只能指定一个表达式,当 EXISTS 没有引入子查询。

我如何做到这一点?

【问题讨论】:

    标签: sql-server tsql sql-server-2008 table-valued-parameters


    【解决方案1】:

    您将使用交叉应用:

    SELECT a.rawData, b.*
    FROM TableA a
    CROSS APPLY FunctionA(a.rawdata) b
    

    【讨论】:

      【解决方案2】:

      好的,首先,让我们检查一下您收到错误的原因。你的语法有什么问题?

      嗯,select 子句中的子查询预计最多返回一列。您的子查询通过使用*,返回函数调用结果中的所有列,在这种情况下似乎不止一个。

      接下来,你想完成什么?看起来您正试图从tableA 中获取列的值,并将functionA 应用于从tableA 返回的每一行的该列中的值。

      正确的语法是使用apply。有cross applyouter apply。它们之间的区别就像inner joinleft join(或left outer join)之间的区别。

      换句话说,对于cross apply,如果对functionA 的调用没有返回来自tableA 的特定行的行,那么来自tableA 的行将不包括在内。对于outer apply,这种情况会被颠倒过来,因为tableA 中的行仍将被包括在内,只是函数调用中的列将为空。

      根据您的问题中的查询,使用此语法的示例查询如下:

      select fa.*
      from tableA ta
      outer apply functionA(ta.rawData) fa;
      

      请注意,我在示例中使用了 outer apply,因为您的查询似乎没有预期来自 tableA 的行并且没有从 functionA 返回的行被排除。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多