【问题标题】: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 apply 和outer apply。它们之间的区别就像inner join 和left 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 返回的行被排除。