如何在 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
我的期望是我应该从 functionA 和 rawData 中获取具有该值的每一行,但我遇到以下错误:
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。
完成此操作的正确语法是使用 apply
。 cross apply
和 outer apply
都有。它们之间的区别就像 inner join
和 left 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 ] 被排除在外。
我有一个 tableA 和其中一个字符串列 (rawData) 我有一个 table 值函数 (functionA),该函数将接受 'rawData' 作为输入参数和 returns 五个新字段。 那个函数有什么作用? - 这将进行一些字符串操作并将一些数据拆分为五个值
我的动机是 select 那个字符串列 (rawData) 并且还传递那个 table 值函数 (functionA) 并为 tableA
中的每一行获取这五个新字段示例如下:
Select
(Select * from function (rawData))
from tableA
我的期望是我应该从 functionA 和 rawData 中获取具有该值的每一行,但我遇到以下错误:
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。
完成此操作的正确语法是使用 apply
。 cross apply
和 outer apply
都有。它们之间的区别就像 inner join
和 left 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 ] 被排除在外。