Outer Apply Spalten werden unerwartet zurückgegeben. NOT NULL, wenn keine Übereinstimmung vorliegt.

Bei Verwendung von OUTER APPLY stoße ich bei einer Tabellenwertfunktion auf merkwürdiges Verhalten. Ich habe eine einfache Inline-Funktion, die einige einfache Berechnungen zurückgibt, die auf einer Zeile in einer anderen Tabelle basieren. Wenn die Eingabewerte für die TVF fest codierte Skalare sind, wird keine Zeile zurückgegeben. Wenn ich dieselben Skalare verwende und aus ihnen in einem CTE eine einzelne Zeile mache, werden sie mit CROSS APPLY (keine Ergebnismenge) als Spalten eingespeist. Wenn ich mit OUTER APPLY dasselbe mache, erhalte ich (wie erwartet) eine Zeile, aber zwei der Ausgabespalten sindNULL und die anderen zweiNOT NULL. Basierend auf BOL sollte das mit einem @ nicht passierOUTER APPLY. Ist das ein Benutzerfehler? Ich habe eine einfache Version geschrieben, um das Problem zu demonstrieren.

--Test set-up
CREATE FUNCTION dbo.TVFTest
(
       @keyID INT,
       @matchValue1 MONEY,
       @matchValue2 MONEY
)
RETURNS TABLE AS RETURN
(
WITH TestRow
     AS (SELECT @keyID       AS KeyID,
                @matchValue1 AS MatchValue1,
                @matchValue2 AS MatchValue2)
SELECT KeyID,
       MatchValue1,
       MatchValue2,
       CASE
         WHEN MatchValue1 <> MatchValue2
           THEN 'Not equal'
         ELSE 'Something else'
       END AS MatchTest
FROM   TestRow
WHERE  MatchValue1 <> MatchValue2 
)
GO

Abfrag

WITH Test AS
(
       SELECT 12 AS PropertyID,
              $350000 AS Ap1,
              350000 AS Ap2
)
SELECT LP.*
FROM Test T
OUTER APPLY dbo.TVFTest
(
       T.PropertyID,
       T.Ap1,
       T.Ap2
) LP;

Ergebniss

+-------+-------------+-------------+-----------+
| KeyID | MatchValue1 | MatchValue2 | MatchTest |
+-------+-------------+-------------+-----------+
|    12 | 350000.00   | NULL        | NULL      |
+-------+-------------+-------------+-----------+

UsingCross Apply gibt erwartungsgemäß keine Zeilen zurück. Wenn Sie auch den CTE entfernen und Inline-Konstanten verwenden, wird keine Zeile zurückgegeben.

--Scalars, no row here...
SELECT LP.*
FROM dbo.TVFTest
(
       12,
       $350000,
       350000
) LP;

Antworten auf die Frage(4)

Ihre Antwort auf die Frage