@table
syntaks opretter en tabelvariabel (en faktisk tabel i tempdb
) og materialiserer resultaterne til det.
WITH
syntaks definerer et fælles tabeludtryk
som ikke er materialiseret og kun er en inline-visning.
Det meste af tiden ville du være bedre stillet ved at bruge den anden mulighed. Du nævner, at dette er inde i en funktion. Hvis dette er en TVF, vil du for det meste have, at disse skal være inline snarere end multi-sætninger, så de kan udvides af optimeringsværktøjet - dette ville øjeblikkeligt forhindre brugen af tabelvariabler.
Nogle gange (f.eks. at den underliggende forespørgsel er dyr, og du vil undgå, at den udføres flere gange) kan du dog finde ud af, at materialisering af de mellemliggende resultater forbedrer ydeevnen i nogle specifikke tilfælde. Der er i øjeblikket ingen måde at tvinge dette til CTE'er (uden at tvinge en planvejledning i det mindste )
I det tilfælde har du (generelt) 3 muligheder. En @tablevariable
, #localtemp
tabel og en ##globaltemp
bord. Men kun den første af disse er tilladt til brug i en funktion.
For yderligere information om forskellene mellem tabelvariabler og #temp-tabeller se her .