SQL Server 用户定义函数返回表——不能从选择查询中调用它
Posted
技术标签:
【中文标题】SQL Server 用户定义函数返回表——不能从选择查询中调用它【英文标题】:SQL Server user defined function returns table -- cannot call it from select query 【发布时间】:2017-04-02 14:57:19 【问题描述】:我无法让这种类型的选择查询(伪代码)工作。对于给定的“UID_VEHICLE”,UDF 返回一个在单行中包含 8 列的表。当“UID_VEHICLE”作为常数提供时,它工作得很好,比如 3308。但是对于给定的客户,我需要为每辆车提供一行这些函数结果——最多返回 100 行。
SELECT
*
FROM
[dbo].[fnGetNextDOT_InspectionData](UID_VEHICLE)
WHERE
UID_VEHICLE IN (SELECT UID_VEHICLE
FROM tVEHICLES
WHERE UID_CUSTOMER = 88);
欢迎您的 cmets 和解决方案...谢谢...约翰
【问题讨论】:
【参考方案1】:将查询中的行值传递到 TVF 时,您需要使用 CROSS APPLY
或 OUTER APPLY
(从 SQL Server 2005 开始):
SELECT * -- or dot.*, or whatever is desired
FROM tVEHICLES veh
CROSS APPLY [dbo].[fnGetNextDOT_InspectionData](veh.UID_VEHICLE) dot
WHERE veh.UID_CUSTOMER = 88;
【讨论】:
优秀!!!这是答案,但有细微的变化..SELECT dot.*...非常感谢你——你很聪明!!! @JohnD 欢迎您,我更新了我的答案。起初我没有包含它,因为我不知道您需要哪些列,并认为您会根据需要更改SELECT
。
@srutzky...亲爱的先生...虽然我将此标记为答案,并感谢您的回答,但我发现在进一步检查结果集后,我将 CROSS 设置为OUTER 并发现并非所有 customer=88 的车辆都被退回。有什么想法吗?
@JohnD 为什么要将CROSS
更改为OUTER
?如果InspectionData
TVF 没有看到一些数据和逻辑,就不可能说。
@srutzky...感谢您的及时回复。经过进一步研究,我认为这是由于 TVF 查询语句的制定有问题。我发现一些博客答案表明,在引用属于左表的列时,LEFT OUTER JOIN 中的错误 where 子句可以将 OUTER(意图)减少为 INNER。我暂时让你摆脱这个问题,因为我需要重新形成 TVF 查询。你想看代码吗?以上是关于SQL Server 用户定义函数返回表——不能从选择查询中调用它的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 2008 - 返回连接条目和“无法绑定多部分标识符”错误的用户定义函数
SQL Server 2008 - UDF 参数类型和返回类型