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 APPLYOUTER 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 用户定义函数返回表——不能从选择查询中调用它的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL自定义函数

SQL Server 2008 - 返回连接条目和“无法绑定多部分标识符”错误的用户定义函数

缓存用户定义函数的输出(ms sql server)

SQL Server 2008 - UDF 参数类型和返回类型

数据库原理与应用(SQL Server)笔记 第十章 用户定义函数

SQL Server 自定义函数