@table
синтаксис създава таблична променлива (действителна таблица в tempdb
) и материализира резултатите към него.
WITH
синтаксис дефинира общ табличен израз
който не е материализиран и е просто вграден изглед.
През повечето време би било по-добре да използвате втората опция. Споменавате, че това е вътре във функция. Ако това е TVF, тогава през повечето време искате те да са вградени, а не мулти изрази, така че да могат да бъдат разширени от оптимизатора - това незабавно ще забрани използването на променливи на таблицата.
Понякога обаче (да кажем, че основната заявка е скъпа и искате да избегнете многократното й изпълнение) може да определите, че материализирането на междинните резултати подобрява производителността в някои конкретни случаи. Има в момента няма начин за принудително налагане на това за CTE (без да се налага поне ръководство за план )
В този случай вие (като цяло) имате 3 възможности. @tablevariable
, #localtemp
таблица и ##globaltemp
маса. Само първото от тях обаче е разрешено за използване във функция.
За допълнителна информация относно разликите между променливите на таблицата и #temp таблиците вижте тук .