Cross Apply-Inting einer parametrisierten Funktion
-
22-10-2019 - |
Frage
Angesichts der folgenden Definitionen:
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'
)
Ich versuche, die Funktion zur Tabelle zu verbinden, damit ich einen kalkulierten Wert erhalte (s) pro Zeile. Beispiel: In einer Buchungstabelle muss ich den Preis basierend auf einem Startdatum und dem Enddatum erhalten.
Hier ist eine Beispielabfrage:
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
Während ich denke, ich bekomme die richtigen Ergebnisse in meiner tatsächlichen Abfrage, wie geht es dem, wie das ist CROSS APPLY
In diesem Fall die Ergebnisse erhalten? Bekommt es sie (effektiv) Reihen für Reihen? Oder funktioniert es in ähnlicher Weise wie CROSS JOIN
(dh: Ein kartesischer Produkt machen)?
Lösung
CROSS APPLY
Nimmt eine Tabelle wertvolle Funktion und "Anwendet" -Parameter aus jeder Zeile in der Abfrage, auf die Sie sie anwenden. Die Funktion wird für jede Zeile einmal bewertet und die Ausgabe wird implizit mit der Quellzeile in dem Datensatzsatz verbunden, aus dem die Parameter erhalten wurden. Beachten Sie, dass dieser 'Join' 1: m sein kann - mit einer TVF -One -Zeile an der Quelle kann mehrere Ausgabezeilen aus dem TVF generieren.
Sie müssen in der WHERE -Klausel keine weiteren Prädikate verwenden, um den Ergebnissen zu verbinden, es sei denn, (aus irgendeinem Grund) möchten Sie die Ausgabe der Funktion weiter filtern, indem Sie ein zusätzliches Prädikat anwenden.
CROSS APPLY
ist sehr nützlich bei XPath -Abfragen, wenn Sie sich um XML -Felder herum befassen müssen, die möglicherweise wiederholende Gruppen enthalten.