Крест применить параметризованную функцию
-
22-10-2019 - |
Вопрос
Учитывая следующие определения:
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 в исходном источнике может генерировать несколько строк вывода от TVF.
Вам не нужно использовать больше предикатов в предложении «Где», чтобы присоединиться к результатам, если (по какой -то причине) вы хотите дальше отфильтровать вывод функции, применив дополнительный предикат.
CROSS APPLY
довольно полезен с запросами XPath, если вам нужно идти по полевым полям, которые могут содержать повторяющиеся группы.