CROSS APPLY-ment une fonction paramétrée
-
22-10-2019 - |
Question
Étant donné les définitions suivantes:
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'
)
Je suis en train de rejoindre la fonction à la table pour que je reçois une valeur calculée (s) par ligne. Exemple: Dans une table de réservations, je dois obtenir le prix basé sur une date de début et de fin.
Voici un exemple de requête:
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
Alors que je pense que je reçois les résultats corrects dans ma requête réelle, comment le CROSS APPLY
obtenir les résultats dans ce cas? Est-il obtenir les ligne par ligne (efficace)? Ou faut-il travailler d'une manière similaire à CROSS JOIN
(ex: fabrication d'un produit cartésien)?
La solution
CROSS APPLY
prend une fonction d'une valeur de table et « applique » les paramètres de chaque ligne de la requête que vous postulez à. La fonction est évaluée une fois pour chaque ligne et la sortie est implicitement reliée à la ligne source dans l'ensemble de fiche dont les paramètres ont été obtenus. On notera que cette « jointure » peut être de 1:. M - avec un TVF une rangée à la source peut générer plusieurs lignes de sortie du TVF
Vous n'avez pas besoin d'utiliser les plus prédicats dans la clause where de se joindre aux résultats à moins que (pour une raison quelconque) vous souhaitez filtrer davantage la sortie de la fonction en appliquant un prédicat supplémentaire.
CROSS APPLY
est tout à fait utile avec des requêtes XPath si vous devez aller fureter autour des champs XML qui peuvent contenir des groupes de répétition.