给定以下定义:

CREATE TABLE MyTable
(
    col1 int,
    col2 int,
    col3 int,
    col4 int
)

CREATE FUNCTION fn_MyFunction
(
    @Param1 int,
    @Param2 int
)
RETURNS TABLE AS RETURN
(
    SELECT @Param1 * 2 AS 'res1', @Param2 * 4 AS 'res2', @Param1 AS 'col3'
)

我试图将功能加入表,以便我得到一个计算的值 (S) 每行。示例:在预订表中,我需要根据开始日期和结束日期来获取价格。

这是一个示例查询:

SELECT      tbl.col1
,           tbl.col2
,           tbl.col3
,           fn.res1
,           fn.res1
FROM        MyTable tbl
CROSS APPLY fn_MyFunction(tbl.col3, tbl.col4) fn
WHERE       fn.col3 = tbl.col3

虽然我认为我在实际查询中获得了正确的结果,但是 CROSS APPLY 在这种情况下获得结果?它是否有效地使他们逐行?还是它以类似的方式工作 CROSS JOIN (即:制作笛卡尔产品)?

有帮助吗?

解决方案

CROSS APPLY 在您将其应用于查询的查询中,从每一行中获取一个值的函数,并从每行中使用“应用”参数。每行一次评估该函数,并将输出隐式连接到获得参数的记录集中的源行。请注意,此“加入”可以为1:m-使用TVF One行,可以从TVF产生多行输出。

您无需在Where子句中使用其他谓词即可加入结果,除非(由于某些原因)您要通过应用附加的谓词进一步过滤函数的输出。

CROSS APPLY 如果您必须在可能包含重复组的XML字段周围进行底漆,则对XPath查询非常有用。

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top