首页 > 解决方案 > 如何合并select中调用的函数返回的表?

问题描述

我创建了一个函数,它接受nvarchar并返回一个包含一列和可变行数的表。

问题是我需要像这样调用函数

SELECT fn_My_Func(V.Value)
FROM tblValues V

如何为表中的每一行调用该函数,然后将结果合并到一个结果集中?

标签: sqlsql-server

解决方案


你可以使用交叉应用

SELECT *  FROM tblValues V
CROSS APPLY fn_My_Func(V.Value) L;

APPLY 运算符允许您连接两个表表达式;每次从左表表达式的每一行处理右表表达式。正如您可能已经猜到的那样,首先计算左表表达式,然后针对最终结果集的左表表达式的每一行计算右表表达式。最终结果集包含左表表达式中的所有选定列,后跟右表表达式的所有列。

SQL Server APPLY 运算符有两种变体;交叉应用和外部应用

  • 如果与右表表达式匹配,则 CROSS APPLY 运算符仅返回左表表达式(在其最终输出中)中的那些行。换句话说,右表表达式只返回左表表达式匹配的行。
  • OUTER APPLY 运算符返回左表表达式中的所有行,而不管它是否与右表表达式匹配。对于那些在右表表达式中没有对应匹配的行,它在右表表达式的列中包含 NULL 值。
  • 所以你可能会得出结论,CROSS APPLY 相当于一个 INNER JOIN(或者更准确地说,它就像一个带有相关子查询的 CROSS JOIN),隐式连接条件为 1=1,而 OUTER APPLY 相当于一个 LEFT外连接。

推荐阅读