表变量的重复申明是否会覆盖之前的内容??

今天一到公司就被用户轰炸了,问为啥系统会出现重复的数据,因为有同事离职,这原来也不是我负责的功能,一时间我也不能立刻想到是哪儿出了问题,只得耐着性子去看逻辑,主要数据组织是在一个存储过程里,逻辑也没什么复杂的地方,就是循环里面套着循环,下图中其中1是标准数据,2,3是问题数据,里面有重复

逻辑一遍简单浏览下来我觉得是循环后面拼接字符串部分出了问题,也没问细想便将我的想法汇报给了领导,领导直接给否了,然后领导的一通解释使我恍然大悟,也深感惭愧,工作两年,居然还犯这么低级的错误。

通过这一小段插曲也让我学到了些道理,工作中遇到问题不要思维定势,理所当然的觉得应该是怎样怎样,要有钻研的精神,从多方面考虑是否合理。有点扯远了...然后根据领导说的这一思路开始重新看逻辑,终于发现了一些端倪,如图,每次循环的开头都会申明一次表变量,而在之后的逻辑中并没有删除表变量的部分,我的怀疑:每次循环一遍执行完,再次循环申明该表变量时,原来的表变量是否会被覆盖或是删除?为了验证这一想法,写了段测试脚本,在循环里申明表变量,并往里插数据,然后查询数据,通过结果可以看出,在一个批处理语句中,已申明的表变量再次申明并不会被覆盖,数据依然存在自此,总算找到数据重复的原因了,也对sqlserver的表变量有了新的理解,不知道其他语言中是否会这样,以后有空可以测试看看。

最后附上表变量的定义及特性:

‘’变量的具体定义包括列定义,列名,数据类型和约束。而在表变量中可以使用的约束包括主键约束,唯一约束,NULL约束和CHECK约束(外键约束不能在表变量中使用)。定义表变量的语句是和正常使用Create Table定义表语句的子集。只是表变量通过DECLARE @local_variable语句进行定义。

表变量的特征:

  1. 表变量拥有特定作用域(在当前批处理语句中,但不在任何当前批处理语句调用的存储过程和函数中),表变量在批处理结束后自动被清除
  2. 表变量较临时表产生更少的存储过程重编译。
  3. 针对表变量的事务仅仅在更新数据时生效,所以锁和日志产生的数量会更少。
  4. 由于表变量的作用域如此之小,而且不属于数据库的持久部分,所以事务回滚不会影响表变量。

 

猜你喜欢

转载自blog.csdn.net/m0_37980851/article/details/81221553
今日推荐