如何向表值函数传递参数

27

我想要做类似的事情

select * from tvfHello(@param) where @param in (Select ID from Users)

Rajivdas:你能再澄清一下你的问题吗?恐怕我们每个人都有不同的解释。 - kristof
3个回答

44

你需要使用CROSS APPLY来实现这个目标。

select 
    f.* 
from 
    users u
    cross apply dbo.tvfHello(u.ID) f

我以前从未使用过CROSS APPLY,现在我看到了它的优点,非常感谢@kristof。 - Frank Myat Thu

5
以下内容适用于AdventureWorks数据库:
CREATE FUNCTION dbo.EmployeeByID(@employeeID int)
RETURNS TABLE
AS RETURN
(
    SELECT * FROM HumanResources.Employee WHERE EmployeeID = @employeeID
)
GO


DECLARE @employeeId int

set @employeeId=10

select * from 
EmployeeById(@employeeId) 
WHERE @EmployeeId in (SELECT EmployeeId FROM HumanResources.Employee)

编辑

根据Kristof的专业知识,如果您想获取多个值,您可以尝试以下操作:

select * 
from HumanResources.Employee e
CROSS APPLY  EmployeeById(e.EmployeeId)
WHERE e.EmployeeId in (5,6,7,8)

在我的情况下,我只能看到employeeId = 10的结果,而不能看到其他值的结果。有什么想法吗? - R.D
听起来你试图做的事情比你的问题所表达的要复杂得多(我有这样的感觉)。你想传入所有的用户ID,一个方法是构建一个分隔字符串,然后在函数中将其拆分,但这违背了初衷。 - JoshBerke
Josh。你提供的示例实际上与调用select * from EmployeeById(10) WHERE 10 in (SELECT EmployeeId FROM HumanResources.Employee)相同。要获取多个参数值的结果,您需要使用cross apply(SQLServer2005+)。 - kristof
如果这确实是他的意图,那么这将起作用。从未使用过Cross Apply。 - JoshBerke

0

在我看来,那看起来还不错,只是你应该始终在函数前加上它们的模式(通常为dbo)。因此查询应该是:

SELECT * FROM dbo.tvfHello(@param) WHERE @param IN (SELECT ID FROM Users)

1
我认为那样做不会起作用。如果您没有定义 @param,您将收到“必须声明标量变量 '@param'”错误。如果您定义了 @param,则将获得结果分配给 @param(默认为 NULL)。要获取完整的结果集,您需要使用 CROSS APPLY。 - kristof
你在说什么?我只是在更正句子中提供的查询。Rajivdas从未说明他查询的意图,因此你不可能知道他是否需要进行CROSS APPLY操作。 - Matt Hamilton
确实,这个问题不是很清楚,我基于Rajivdas对Josh回答的评论来回答。看看NTulip的评论,就能看出有些人有多困惑了。但肯定有可能是我自己理解错了。 - kristof

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接