SQL Server中的数据类型隐式转换问题

  

写这篇文章的时候,还真不知道如何取的名,也不知道这个该如何将其归类。这个是同事遇到的一个案例,案例比较复杂,这里抽丝剥茧,仅仅构造一个简单的案例来展现一下这个问题。我们先构造测试数据,如下所示:

        创建表的测试   (   ID INT,   GOOD_TYPE VARCHAR (12),   GOOD_WEIGHT数字(18日2)   )   插入dbo.TEST   值(1,T1, 1.27)   选择GOOD_TYPE,   情况(GOOD_TYPE=T1)然后99.1 + (GOOD_WEIGHT)和   其他的上限(SUM (GOOD_WEIGHT))   作为工具,   (GOOD_WEIGHT)作为NetWeight求和   从dbo.TEST   GROUP BY GOOD_TYPE;      

 SQL Server中的数据类型隐式转换问题

  

如上所示,为什么<代码> 99.1 + (GOOD_WEIGHT)和变成100了呢?原始SQL非常复杂,我们分析,排除掉各个因素后,始终不得要领,各种折腾中发现,如果这样转换一下(请见下面截的图),居然就好了,后面分析了一下,应该是时候里面的不同数据类型导致隐式转换,说实话之前还真没有留意情况中存在数据类型的隐性转换,但是为什么就一定从数字转换为INT了呢?而不是INT隐性转换为数字呢,说实话没有看到相关文档的官方,如果按照官方文档:

  

 SQL Server中的数据类型隐式转换问题“> <br/>
  </p>
  <p>当两个不同数据类型的表达式用运算符组合后,优先级较低的数据类型首先转换为优先级较高的数据类型。如果此转换不是所支持的隐式转换,则返回错误。对于组合具有相同数据类型的操作数表达式的运算符时,运算的结果便为该数据类型</p>
  <p>而我们知道,小数点<代码> </代码>和<代码>数字> </代码是同义词,可互换使用,而官方文档”数据类型优先级(transact - sql)”中,十进制的优先级明显高于INT,如果真要按照原理来解释,应该是INT转换数字才对(两种数据类型支持隐式转换),所以越想越糊涂,只知道有这么一回事,但是真正的<代码> </代码>根源尚不清楚,而且在精确度要求较高的报表中,这种现象就会类似虫一样的突然出现。需要谨慎留心! </p>
  <p>参考资料:</p>
  <p> https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/data-type-precedence-transact-sql& # 63;查看sql - server - 2017 </p>=<p> https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/data-type-conversion-database-engine& # 63;查看sql - server - 2017 </p>=<p> </p>
  <p>以上所述是小编给大家介绍的SQL Server中的数据类型隐式转换问题,希望对大家有所帮助,如果大家有任何疑问请给我留的言,小编会及时回复大家的。在此也非常感谢大家对网站的支持。<br/>
  如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢! </p><h2 class=SQL Server中的数据类型隐式转换问题