您现在的位置是:网站首页> 编程资料编程资料
SQL Server 中的数据类型隐式转换问题_MsSql_
2023-05-26
351人已围观
简介 SQL Server 中的数据类型隐式转换问题_MsSql_
写这篇文章的时候,还真不知道如何取名,也不知道这个该如何将其归类。这个是同事遇到的一个案例,案例比较复杂,这里抽丝剥茧,仅仅构造一个简单的案例来展现一下这个问题。我们先构造测试数据,如下所示:
CREATE TABLE TEST ( ID INT, GOOD_TYPE VARCHAR(12), GOOD_WEIGHT NUMERIC(18,2) ) INSERT INTO dbo.TEST VALUES( 1, 'T1',1.27) SELECT GOOD_TYPE, CASE WHEN ( GOOD_TYPE = 'T1' ) THEN 99.1 + SUM(GOOD_WEIGHT) ELSE CEILING(SUM(GOOD_WEIGHT)) END AS GrossWeight , SUM(GOOD_WEIGHT) AS NetWeight FROM dbo.TEST GROUP BY GOOD_TYPE;
如上所示,为什么99.1 + SUM(GOOD_WEIGHT)变成100了呢? 原始SQL非常复杂,我们分析、排除掉各个因素后,始终不得要领,各种折腾中发现,如果这样转换一下(请见下面截图),居然就OK了,后面分析了一下,应该是CASE WHEN里面的不同数据类型导致隐式转换,说实话之前还真没有留意CASE WHEN中存在数据类型的隐性转换,但是为什么就一定从NUMERIC转换为INT了呢? 而不是INT隐性转换为NUMERIC呢, 说实话没有看到相关文档的官方,如果按照官方文档:
当两个不同数据类型的表达式用运算符组合后,优先级较低的数据类型首先转换为优先级较高的数据类型。 如果此转换不是所支持的隐式转换,则返回错误。 对于组合具有相同数据类型的操作数表达式的运算符时,运算的结果便为该数据类型
而我们知道,Decimal 和 NUMERIC 是同义词,可互换使用,而官方文档“数据类型优先级 (Transact-SQL)”中,Decimal的优先级明显高于INT,如果真要按照原理来解释,应该是INT转换NUMERIC才对(两种数据类型支持隐式转换),所以越想越糊涂,只知道有这么一回事,但是真正的Root Cause尚不清楚,而且在精确度要求较高的报表中,这种现象就会类似Bug一样的突然出现。需要谨慎留心!
参考资料:
总结
以上所述是小编给大家介绍的SQL Server 中的数据类型隐式转换问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
- SQL Server中T-SQL 数据类型转换详解
- 详解SQL Server中的数据类型
- SQL Server数据类型转换方法
- SQL Server比较常见数据类型详解
- SQL Server数据类型char、nchar、varchar、nvarchar的区别浅析
- SQL Server中实现二进制与字符类型之间的数据转换
- sqlserver2005 TSql新功能学习总结(数据类型篇)
- SQLserver查询数据类型为ntext是空或NULL值的方法
- SQL SERVER 数据类型详解补充2
- sql server 常用的几个数据类型
- sqlserver 数据类型转换小实验
- SQL SERVER的数据类型
- Sql Server之数据类型详解
相关内容
- sqlserver之datepart和datediff应用查找当天上午和下午的数据_MsSql_
- SQL对数据进行按月统计或对数据进行按星期统计的实例代码_MsSql_
- SQLServer数据库处于恢复挂起状态的解决办法_MsSql_
- SQL server数据库创建代码 filegroup文件组修改的示例代码_MsSql_
- SQL Server基础之行数据转换为列数据_MsSql_
- Sql server端口未打开连接不上的解决方案_MsSql_
- SQL Server的IP不能连接问题解决_MsSql_
- sql server编写通用脚本实现获取一年前日期的方法_MsSql_
- sql server使用公用表表达式CTE通过递归方式编写通用函数自动生成连续数字和日期_MsSql_
- SQL Server实现跨库跨服务器访问的方法_MsSql_


