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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top