Dette er bestemt en fejl i produktet.
En lignende fejl var allerede rapporteret og lukket som "Vil ikke rette" .
Inklusive dette spørgsmål, det linkede forbindelseselement og en anden
to
spørgsmål på dette websted Jeg har set fire tilfælde af denne type adfærd med inline TVF'er og OUTER APPLY
- Alle var af formatet
YDRE APPLY dbo.SomeFunction(...) F
Og returnerede korrekte resultater, når de blev skrevet som
YDRE ANVENDELSE (VÆLG * FRA dbo.SomeFunction(...)) F
Så dette ligner en mulig løsning.
Til forespørgslen
MED Test AS( SELECT 12 AS PropertyID, $350000 AS Ap1, 350000 AS Ap2)SELECT LP.*FROM Test TOUTER APPLY dbo.TVFTest( T.PropertyID, T.Ap1, T.Ap2) LP;
Udførelsesplanen ser sådan ud
Og listen over outputkolonner i den endelige fremskrivning er. Udtr1000, Udtr1001, Udtr1003, Udtr1004.
Men kun to af disse kolonner er defineret i tabellen over konstanter nederst til højre.
Den bogstavelige $350000
er defineret i tabellen over konstanter øverst til højre (Udtdr1001). Dette bliver så ydre sammenføjet på tabellen med konstanter nederst til højre. Da ingen rækker matcher joinbetingelsen, bliver de to kolonner, der er defineret der (Expr1003, Expr1004), korrekt evalueret som NULL. så tilføjer beregningsskalaren det bogstavelige 12
ind i datastrømmen som en ny kolonne (Expr1000) uanset resultatet af den ydre joinforbindelse.
Det er slet ikke den korrekte semantik. Sammenlign med den (korrekte) plan, når den inline TVF er manuelt inlinet.
MED Test AS (SELECT 12 AS PropertyID, $350000 AS Ap1, 350000 AS Ap2)VÆLG LP.*FRA Test T OUTER APPLY (SELECT KeyID, MatchValue1, MatchValue2, CASE WHEN MatchValue1 <> MatchValue2 THEN 'Ikke lig ' ELSE 'Noget andet' END SOM MatchTest FRA (SELECT T.PropertyID AS KeyID, T.Ap1 AS MatchValue1, T.Ap2 AS MatchValue2) TestRow WHERE MatchValue1 <> MatchValue2) LP
Her er kolonnerne brugt i den endelige projektion Expr1003, Expr1004, Expr1005, Expr1006
. Alle disse er defineret i nederste højre konstant scanning.
I tilfældet med TVF ser det ud til at gå galt meget tidligt.
Tilføjelse af OPTION (RECOMPILE, QUERYTRACEON 3604, QUERYTRACEON 8606);
viser, at inputtræet til processen allerede er forkert. Udtrykt i SQL er det noget i stil med.
SELECT Expr1000, Expr1001, Expr1003, Expr1004FROM (VÆRDIER (12, $350000, 350000)) V1(Expr1000, Expr1001, Expr1002) YDRE ANVENDELSE (SELECT I0IF01Exr, SELECT I0IF(00Exr, 'Noget andet') AS Udtr1004 FRA (VÆLG CAST(Udtr1002 SOM PENGE) SOM Udtr1003) D HVOR Udtr1001 <> Udtr1003) OA
Det fulde output af det sporingsflag er som følger (Og 8605 viser stort set det samme træ.)
*** Inputtræ:*** LogOp_Project COL:Expr1000 COL:Expr1001 COL:Expr1003 COL:Expr1004 LogOp_Apply (x_jtLeftOuter) LogOp_Project LogOp_ConstTableGet (1) [empty] AncOp_ElcTI,ContI01(Tom] AncOp_EloptI0,ContI0 ML=4) XVAR(int,Ikke ejet,Værdi=12) AncOp_PrjEl COL:Expr1001 ScaOp_Const TI(penge,ML=8) XVAR(penge,Ikke ejet,Værdi=(10000enheder)=(-794967296)))Anc02Prj1El C02Prj ScaOp_Const TI(int,ML=4) XVAR(int,Ikke ejet,Værdi=350000) LogOp_Project LogOp_Select LogOp_Project LogOp_ConstTableGet (1) [empty] AncOp_PrjList AncOp_PrjEl COL:Expr1003 penge ScaOp_Convert ,Null,ML=8 ScaOp_Identifier COL:Expr1002 ScaOp_Comp x_cmpNe ScaOp_Identifier COL:Expr1001 ScaOp_Identifier COL:Expr1003 AncOp_PrjList AncOp_PrjEl COL:Expr1004 ScaOp_IIF varchar collate 53256,Var,Trim,ML=14 ScaOp_Comp x_cmpNe ScaOp_Identifier COL:Expr1001 ScaOp_Identifier COL:Expr1003 ScaOp_Const TI( varchar collate 53256,Var,Trim,ML=9) XVAR(varchar,Owned,Value=Len,Data =(9,Ikke lig)) ScaOp_Const TI(varchar collate 53256,Var,Trim,ML=14) XVAR(varchar, Owned,Value=Len,Data =(14,Noget andet)) AncOp_PrjList ********************