Dadas as seguintes definições:
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'
)
Estou tentando juntar a função à tabela para que eu obtenha um valor calculado (s) por linha. Exemplo: Em uma tabela de reservas, preciso obter o preço com base em uma data inicial e uma data final.
Aqui está um exemplo de consulta:
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
Embora eu ache que estou obtendo os resultados corretos em minha consulta real, como CROSS APPLY
obtenho os resultados neste caso? Isso os obtém linha por linha (efetivamente)? Ou funciona de maneira semelhante a CROSS JOIN
(ou seja: fazer um produto cartesiano)?
CROSS APPLY
pega uma função com valor de tabela e 'aplica' parâmetros de cada linha na consulta à qual você está aplicando. A função é avaliada uma vez para cada linha e a saída é unida implicitamente à linha de origem no conjunto de registros do qual os parâmetros foram obtidos. Observe que essa 'junção' pode ser 1:M - com um TVF, uma linha na origem pode gerar várias linhas de saída do TVF.Você não precisa usar mais nenhum predicado na cláusula where para unir os resultados, a menos que (por algum motivo) queira filtrar ainda mais a saída da função aplicando um predicado adicional.
CROSS APPLY
é bastante útil com consultas xpath se você tiver que vasculhar campos XML que podem conter grupos repetidos.