【问题标题】:SQL Server user defined function returns table -- cannot call it from select querySQL Server 用户定义函数返回表——不能从选择查询中调用它
【发布时间】: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 和解决方案...谢谢...约翰

【问题讨论】:

    标签: sql-server user-defined-functions


    【解决方案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 查询。你想看代码吗?
    猜你喜欢
    • 2013-11-07
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    相关资源
    最近更新 更多