如何在 select 子句中使用 table 值函数?

How to use a table valued function in select clause?

我有一个 tableA 和其中一个字符串列 (rawData) 我有一个 table 值函数 (functionA),该函数将接受 'rawData' 作为输入参数和 returns 五个新字段。 那个函数有什么作用? - 这将进行一些字符串操作并将一些数据拆分为五个值

我的动机是 select 那个字符串列 (rawData) 并且还传递那个 table 值函数 (functionA) 并为 tableA

中的每一行获取这五个新字段

示例如下:

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

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

Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

如何实现?

您将使用交叉应用:

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

好的,首先,让我们检查一下为什么会出现错误。你的语法有什么问题?

那么,select 子句中的子查询预计最多 return 一列。您的子查询,通过使用 *,是 returning 来自函数调用结果的所有列,在这种情况下似乎不止一个。

接下来,您想要完成什么?看起来您正在尝试从 tableA 中获取一列的值,并将 functionA 应用到该列中的值,为从 tableA 编辑的每一行 return。

完成此操作的正确语法是使用 applycross applyouter apply 都有。它们之间的区别就像 inner joinleft join(或 left outer join)之间的区别。

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

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

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

请注意,我在我的示例中使用了 outer apply,因为您的查询似乎不期望来自 tableA 的行没有来自 functionA 的行 return ] 被排除在外。