给定以下定义:
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'
)
我正在尝试将函数加入表中,以便获得每行的计算值。示例:在预订表中,我需要根据开始日期和结束日期获取价格。
这是一个示例查询:
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 可以从 TVF 生成多行输出。您不需要在 where 子句中使用更多谓词来连接结果,除非(出于某种原因)您希望通过应用附加谓词来进一步过滤函数的输出。
CROSS APPLY
如果您必须搜索可能包含重复组的 XML 字段,这对 xpath 查询非常有用。