Aplicar cruzado una función parametrizada
-
22-10-2019 - |
Pregunta
Dadas las siguientes definiciones:
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'
)
Estoy tratando de unir la función a la tabla para obtener un valor calculado (s) por fila. Ejemplo: en una tabla de reservas, necesito obtener el precio basado en una fecha de inicio y una fecha de finalización.
Aquí hay una consulta de ejemplo:
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
Si bien creo que estoy obteniendo los resultados correctos en mi consulta real, ¿cómo es el CROSS APPLY
obtener los resultados en este caso? ¿Los obtiene fila por fila (efectivamente)? O funciona de manera similar a CROSS JOIN
(es decir,: hacer un producto cartesiano)?
Solución
CROSS APPLY
Toma una función valorada de tabla y 'aplica' parámetros de cada fila en la consulta a la que la está aplicando. La función se evalúa una vez para cada fila y la salida se une implícitamente a la fila de origen en el conjunto de registros desde el cual se obtuvieron los parámetros. Tenga en cuenta que esta 'unirse' puede ser 1: M - con una fila TVF en la fuente puede generar múltiples filas de salida del TVF.
No necesita usar más predicados en la cláusula WHERE para unir los resultados a menos que (por alguna razón) desee filtrar aún más la salida de la función aplicando un predicado adicional.
CROSS APPLY
es bastante útil con las consultas XPath si tiene que ver a los campos XML que pueden contener grupos repetidos.