临时表,保存在 tempdb中,
表变量,保存在内存中,他和临时表的区别是 一个是保存在tempdb,一个保存在内存中
公用表表达式cte是sqlserver2005新增的,是把一个记录集当做一个变量来使用,他跟表变量的区别是不需要insert数据,所以应该比表变量更高效;
如果只使用一次cte应该是最好的,如果要重复多次使用同一个记录集,我个人认为还是表变量
如果还需要用到truncate语句来清除临时的数据,那最好用临时表,因为表变量不支持truncate,
truncate table 是通过释放存储表数据所用的数据页来删除数据。而表变量的数据是保存在内存中的,而非磁盘中,那么就truncate table 试图释放表变量并不存在的 “数据页”, 当然会报错了