@table
syntax skapar en tabellvariabel (en faktisk tabell i tempdb
) och materialiserar resultaten till den.
WITH
syntax definierar ett vanligt tabelluttryck
som inte materialiseras och bara är en inline-vy.
För det mesta skulle det vara bättre att använda det andra alternativet. Du nämner att detta är inuti en funktion. Om detta är en TVF vill du oftast att dessa ska vara inline snarare än multi-sats så att de kan utökas av optimeraren - detta skulle omedelbart förbjuda användningen av tabellvariabler.
Men ibland (säg att den underliggande frågan är dyr och du vill undvika att den exekveras flera gånger) kanske du kan avgöra att realisering av mellanresultaten förbättrar prestandan i vissa specifika fall. Det finns inte för närvarande att tvinga fram detta för CTE (utan att tvinga fram en planguide åtminstone )
I så fall har du (i allmänhet) 3 alternativ. En @tablevariable
, #localtemp
tabell och en ##globaltemp
tabell. Men endast den första av dessa är tillåten för användning i en funktion.
För ytterligare information om skillnaderna mellan tabellvariabler och #temp-tabeller se här .