CROSS-zione applicare una funzione parametrizzata
-
22-10-2019 - |
Domanda
Date le seguenti definizioni:
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'
)
Sto cercando di unire la funzione di tavolo in modo che ottengo un valore calcolato (s) per riga. Esempio: in una tabella le prenotazioni, ho bisogno di ottenere il prezzo sulla base di una data di inizio e di fine.
Ecco un esempio di query:
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
Mentre penso che sto ottenendo i risultati corretti nella mia domanda reale, come fa il CROSS APPLY
ottenere i risultati in questo caso? Ha farli riga per riga (efficace)? O lo fa lavorare in modo simile a CROSS JOIN
(cioè: fare un prodotto cartesiano)?
Soluzione
CROSS APPLY
prende una funzione con valori di tabella e 'applica' parametri da ogni riga della query che si sta applicando a. La funzione viene valutata una volta per ogni riga e l'uscita è implicitamente unito alla riga sorgente nel set di record da cui sono stati ottenuti i parametri. Si noti che questo 'unirsi' può essere 1:. M - con un TVF una riga alla fonte può generare più righe di uscita dal TVF
Non è necessario utilizzare qualsiasi più predicati nella clausola WHERE per unire i risultati a meno che (per qualche ragione) che si desidera ulteriore filtro all'uscita della funzione mediante l'applicazione di un predicato aggiuntivo.
CROSS APPLY
è molto utile con le query XPath se devi andare ferreting attorno ai campi di XML che può contenere gruppi ripetuti.