@table
składnia tworzy zmienną tabeli (rzeczywista tabela w tempdb
) i materializuje do niego wyniki.
WITH
składnia definiuje Wspólne wyrażenie tabelowe
który nie jest zmaterializowany i jest tylko wbudowanym widokiem.
W większości przypadków lepiej byłoby skorzystać z drugiej opcji. Wspomniałeś, że to jest wewnątrz funkcji. Jeśli jest to TVF, przez większość czasu chcesz, aby były one inline, a nie multi-instrukcje, aby mogły zostać rozszerzone przez optymalizator - to natychmiast uniemożliwiłoby użycie zmiennych tabeli.
Czasami jednak (powiedzmy, że zapytanie bazowe jest drogie i chcesz uniknąć wielokrotnego wykonywania) możesz stwierdzić, że zmaterializowanie wyników pośrednich poprawia wydajność w niektórych szczególnych przypadkach. Istnieje obecnie nie ma mowy wymuszenia tego dla CTE (bez wymuszania przynajmniej przewodnika po planie )
W takiej sytuacji (ogólnie) masz 3 opcje. @tablevariable
, #localtemp
tabela i ##globaltemp
stół. Jednak tylko pierwszy z nich jest dozwolony do użycia wewnątrz funkcji.
Aby uzyskać więcej informacji na temat różnic między zmiennymi tabel a tabelami #temp zobacz tutaj .