题
给定以下定义:
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查询非常有用。
不隶属于 dba.stackexchange