在select语句中执行表值值函数

时间:2016-09-27 18:22:47

标签: sql-server

我有一个带有一个参数的表值函数

mytabfunct(@para nvarchar(20))

此函数返回4个值。

现在我有一个名为Employee的表,我正在运行这样的查询:

select
Fname, Lname,
(select
 * from mytabfunct
 ('joseph'))
from  Employee where
Fname='joseph';

但它给了我错误:

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

我检查了错误,在一些论坛上我发现错误是bcz我的函数正在返回多个记录。但是如何在Employee tbale中使用其他值(如Fname,Lname等)获取所有这4个值。

这里有什么问题,我无法修复。

2 个答案:

答案 0 :(得分:1)

使用CROSS APPLY对表中的每一行执行函数,将行的列作为参数传递,并将结果中的所有行连接起来。

您没有提供更具体的查询示例,因此我无法为您提供更清晰的示例,但这是您应该寻找的。像使用INNER JOIN一样使用CROSS APPLY,只有没有ON子句。

好的,从更新的查询中,你的看起来像这样:

如果您只是选择了一个SELECT mytabfunct(' Joseph'),您将获得包含一些列名的结果集。您需要更改" ColumnName"从上面语句中的表值函数中的一个列名称。你没有显示该函数返回的内容,因此我无法获得更具体的信息。但试试这个,看看它是否让你更接近。

答案 1 :(得分:0)

像这样。

select e.FName
    , e.LName
    , t.Col1
    , t.Col2
    , t.Col3
    , t.Col4
from Employee e
cross apply dbo.mytabfunct(e.FName) t
where e.FName = 'joseph'

我关心的是你的函数接收FName作为唯一的参数。这表明您只能拥有一个具有任何名称的人。当然,如果你的函数不止一个语句,那么需要重新考虑它,因为多语句表值函数对于性能观点而言是可怕的。