SQL Server数据库中的数据类型隐式转换问题
文章主要介绍了SQL Server 中的数据类型隐式转换问题,本文给大家介绍的非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下写这篇文章的时候,还真不知道如何取名,也不知道这...
文章主要介绍了SQL Server 中的数据类型隐式转换问题,本文给大家介绍的非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
写这篇文章的时候,还真不知道如何取名,也不知道这个该如何将其归类。这个是同事遇到的一个案例,案例比较复杂,这里抽丝剥茧,仅仅构造一个简单的案例来展现一下这个问题。我们先构造测试数据,如下所示:
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 中的数据类型隐式转换问题,希望对大家有所帮助
-
Thinkphp5框架实现获取数据库数据到视图的方法
文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下。这是学习thinkhp5的...
-
Linux下使用ps命令来查看oracle数据库相关进程的操作步骤
ps命令的操作是很多的小伙伴在管理进程的操作的时候遇到的问题,对于Linux系统中今天小编就来跟大家分享一下详解Oracle相关进程在电脑中使用ps命令查看的操作步骤。...
-
如何使用Access数据库创建一个简单MIS管理系统
MIS管理系统也是一种很实用的管理系统,可以将很多东西都放的井井有条,便于大家查找,下文中就以大家家中都有的CD、VCD为例,为大家介绍如何建立一个MIS管理系统,使这些东西有条理。...
-
Access数据库日常维护和Access数据库优化方法
文章主要介绍了Access数据库日常维护方法(优化),适用范围:使用Access作为数据库建设的网站。需要的朋友可以参考下...
-
MariaDB数据库的外键约束实例代码介绍详解
文章主要给大家介绍了关于MariaDB数据库的外键约束的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧...
-
Windows10系统下MariaDB数据库安装教程图解
文章给大家介绍Windows10系统下安装MariaDB 的教程图解,感兴趣的朋友一起看看吧,MariaDB由MySQL的创始人麦克尔·维德纽斯主导开发,...
-
Mysql数据库大表优化方案和Mysql大表优化步骤
当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化。单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部...
-
Mysql数据库创建存储过程实现往数据表中新增字段的方法
本文实例讲述了mysql创建存储过程实现往数据表中新增字段的方法,结合实例形式对比分析了通过存储过程新增字段相关操作技巧,需要的朋友可以参考下。...
-
Mysql数据库自定义函数的定义、使用方法及操作注意事项
文章主要介绍了MySQL自定义函数简单用法,结合实例形式分析了mysql自定义函数的基本定义、使用方法及操作注意事项,需要的朋友可以参考下。...
-
Mysql数据库的max_allowed_packet设定方法
小编为大家分享一篇关于Mysql的max_allowed_packet设定,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...