2008-12-03 154 views
20

我要像做如何通过参数表值函数

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

Rajivdas:你能否澄清你的问题多一点。恐怕我们每个人都用不同的方式解释它 – kristof 2008-12-03 16:07:43

回答

32

您需要使用CROSS APPLY实现此目的

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

这看起来不错给我,除了你应该总是与他们的架构(通常是DBO)前缀的功能。因此,查询应该是:

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

我不认为,那会奏效。如果你没有定义@param,你会得到:必须声明标量变量“@参数”。错误。如果你定义了@param,你会得到结果给任何@param分配的(默认为NULL)。要获得全套结果,您需要使用CROSS APPLY – kristof 2008-12-03 10:45:38

+0

你在说什么?我只是纠正了句子中提供的查询。 Rajivdas从未说明他的查询的意图,所以你不可能知道他是否需要进行CROSS APPLY。 – 2008-12-03 11:05:45

+0

的确,问题并不十分清楚,我根据Rajivdas提出的评论回答乔希的回答。看看NTulip发表的评论,看看有些人感到困惑。但肯定的是,我本来可能会在我的案例中错误地解释 – kristof 2008-12-03 16:05:09

3

在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) 

编辑

基于克里斯托夫的专业知识,如果你试图让你多值我已经更新了这个样本可以举例:

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