【问题标题】:How to pass parameters to Table Valued Function如何将参数传递给表值函数
【发布时间】:2010-09-25 01:17:06
【问题描述】:

我想做类似的事情

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

【问题讨论】:

  • Rajivdas:您能否再澄清一下您的问题。恐怕我们每个人都有不同的解读方式

标签: sql-server sql-server-2005 user-defined-functions


【解决方案1】:

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

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

【讨论】:

  • 我以前从未使用过CROSS APPLY,现在我看到了它的优势,非常感谢@kristof。
【解决方案2】:

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 的结果,而不能得到其他值。有什么想法吗?
  • 听起来你试图做一些比你的问题更复杂的事情。 (我有一种感觉你是)。例如,您想传入所有 userId 的...一种方法是构建一个分隔字符串,然后在函数中将其分解,但这违背了目的。
  • 乔希。您给它的示例实际上与在 (SELECT EmployeeId FROM HumanResources.Employee) 中调用 select * from EmployeeById(10) WHERE 10 相同。要获得多个参数值的结果,您需要使用交叉应用 (SQLServer2005+)
  • 如果这确实是他的意图,那就行了。从未使用过交叉应用
【解决方案3】:

这对我来说看起来没问题,除了你应该总是在你的函数前面加上它们的模式(通常是 dbo)。所以查询应该是:

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

【讨论】:

  • 我认为这行不通。如果你没有定义@param,你会得到: 必须声明标量变量“@param”。错误。如果您定义@param,您将获得分配给@param 的任何结果(默认为NULL)。要获得完整的结果集,您需要使用 CROSS APPLY
  • 你在说什么?我只是更正句子中提供的查询。 Rajivdas 从未说明他的查询意图,因此您不可能知道他是否需要进行 CROSS APPLY。
  • 诚然,这个问题不是很清楚,我的回答是基于 Josh Rajivdas 做出的回答。看看 NTulip 的评论,看看有些人有多困惑。但肯定是我解释错了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
相关资源
最近更新 更多