变量分为表变量和标量,表变量是变量的一种,变量都是以@或@@为前缀的,那么什么是标量?可以理解为标准数据类型的变量,比如整型int或者日期型DateTime。
同SQL Server临时表的定义类似,以一个@为前缀的表变量是本地的,因此只有当前用户会话才可以访问,而已两个@为前缀即@@的表变量是全局的,通常都是系统变量,比如代表最近的一个T-SQL语句报错号的@@error。表变量只能在一个批处理中生成,超出了这个边界表变量就不存在了。
表变量存放在内存中,因此用户访问表变量的时候SQL Server是不需要生成日志的。同时变量是不需要考虑其他会话访问的问题,因此也不需要考虑锁机制,对于非常繁忙的系统来说,避免锁的使用可以减少一部分系统负载。
表变量不能创建索引,因此在用户访问表变量的时候也就不存在执行计划选择的问题了,这就意味着编译阶段后就没有优化阶段了。