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)?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top