@table
syntaxe vytvoří proměnnou tabulky (skutečnou tabulku v tempdb
) a zhmotňuje do něj výsledky.
WITH
syntaxe definuje Běžný tabulkový výraz
který není zhmotněný a je pouze vloženým pohledem.
Většinu času by bylo lepší použít druhou možnost. Zmiňujete, že je to uvnitř funkce. Pokud se jedná o TVF, pak většinou chcete, aby byly inline a nikoli více příkazy, aby je mohl optimalizátor rozšířit – to by okamžitě znemožnilo použití proměnných tabulky.
Někdy však (řekněme, že základní dotaz je drahý a chcete se vyhnout tomu, aby byl spouštěn vícekrát) můžete zjistit, že materializace mezivýsledků v některých konkrétních případech zlepšuje výkon. Existuje momentálně žádným způsobem vynucení tohoto pro CTE (bez vynucení průvodce plánem alespoň )
V takovém případě máte (obecně) 3 možnosti. @tablevariable
, #localtemp
tabulka a ##globaltemp
stůl. Ve funkci je však povoleno používat pouze první z nich.
Další informace týkající se rozdílů mezi proměnnými tabulky a tabulkami #temp viz zde .