A
@table
sintaxe cria uma variável de tabela (uma tabela real em tempdb
) e materializa os resultados para ele. O
WITH
sintaxe define uma Expressão de tabela comum
que não é materializado e é apenas uma visualização embutida. Na maioria das vezes, seria melhor usar a segunda opção. Você mencionou que isso está dentro de uma função. Se este for um TVF, na maioria das vezes você deseja que eles sejam inline em vez de instruções múltiplas para que possam ser expandidos pelo otimizador - isso não permitiria instantaneamente o uso de variáveis de tabela.
Às vezes, no entanto (digamos que a consulta subjacente é cara e você deseja evitar que ela seja executada várias vezes), você pode determinar que a materialização dos resultados intermediários melhora o desempenho em alguns casos específicos. Existe atualmente de jeito nenhum de forçar isso para CTEs (sem forçar um guia de plano pelo menos )
Nessa eventualidade você (em geral) tem 3 opções. Uma
@tablevariable
, #localtemp
tabela e um ##globaltemp
tabela. No entanto, apenas o primeiro deles é permitido para uso dentro de uma função. Para obter mais informações sobre as diferenças entre variáveis de tabela e #temp tabelas veja aqui .