Il @table
la sintassi crea una variabile di tabella (una tabella effettiva in tempdb
) e ne materializza i risultati.
Il WITH
la sintassi definisce un Espressione di tabella comune
che non è materializzato ed è solo una vista in linea.
La maggior parte delle volte sarebbe meglio usare la seconda opzione. Hai detto che questo è all'interno di una funzione. Se si tratta di un TVF, la maggior parte delle volte si desidera che questi siano inline anziché multi-istruzione in modo che possano essere espansi dall'ottimizzatore:ciò non consentirebbe immediatamente l'uso di variabili di tabella.
A volte, tuttavia, (ad esempio, la query sottostante è costosa e si desidera evitare che venga eseguita più volte) è possibile che la materializzazione dei risultati intermedi migliori le prestazioni in alcuni casi specifici. C'è al momento non c'è modo di forzare questo per i CTE (senza forzare almeno una guida del piano )
In tale eventualità (in generale) hai 3 opzioni. Un @tablevariable
, #localtemp
tabella e un ##globaltemp
tavolo. Tuttavia, solo il primo di questi può essere utilizzato all'interno di una funzione.
Per ulteriori informazioni sulle differenze tra le variabili di tabella e le tabelle #temp vedi qui .