我有一个带有一个参数的表值函数
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个值。
这里有什么问题,我无法修复。
答案 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作为唯一的参数。这表明您只能拥有一个具有任何名称的人。当然,如果你的函数不止一个语句,那么需要重新考虑它,因为多语句表值函数对于性能观点而言是可怕的。