在sqlserver中如何看表格的类型(SQL Server 中的数据类型隐式转换问题)
在sqlserver中如何看表格的类型
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一样的突然出现。需要谨慎留心!
参考资料:
https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/data-type-precedence-transact-sql?view=sql-server-2017
https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/data-type-conversion-database-engine?view=sql-server-2017
总结
以上所述是小编给大家介绍的SQL Server 中的数据类型隐式转换问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对开心学习网网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
- mysql的binlog日志详解(MySQL 有关MHA搭建与切换的几个错误log汇总)
- docker怎样安装mysql8(docker-compose安装db2数据库操作)
- linux安装sqlserver 2008 r2(Ubuntu 下安装SQL Server教程)
- sql join速度慢(SQL Server 使用join all优化 or 查询速度)
- sqlserver日期型数据类型是哪个(SQL Server时间戳功能与用法详解)
- sql查询数据库前五条信息(SQL查询数据库中符合条件的记录的总数)
- mysql删除的delete怎么找回(MySQL Delete 删数据后磁盘空间未释放的原因)
- linuxmysql安装教程5.7.25学习(linux mysql5.5升级至mysql5.7的步骤与踩到的坑)
- mac版本php环境搭建(在Mac OS X中配置Apache+PHP+MySQL运行环境的详细步骤)
- windows docker 使用数据库教程(docker安装并持久化postgresql数据库的操作步骤)
- 怎么知道sqlyog连接的哪个mysql(SQLyog连接MySQL8.0报2058错误的完美解决方法)
- sql语句中leftjoin的作用(sql中的left join及on、where条件关键字的区别详解)
- docker部署mysql如何访问(完美解决docker安装mysql后Navicat连接不上的问题)
- mysql主从复制如何实现(MySql主从复制实现原理及配置)
- sql2012登录失败(详解安装sql2012出现错误could not open key...解决办法)
- Windows2012配置SQLServer2014AlwaysOn的图解(Windows2012配置SQLServer2014AlwaysOn的图解)
- 七年前的这部剧有毒,全剧只有女主红到发紫,男主至今无人认识(七年前的这部剧有毒)
- 宋轶除了演过于曼丽,原来还演过一个青楼女子(宋轶除了演过于曼丽)
- 赵丽颖第一部当女主的戏,主角配角个个都是实力演员(赵丽颖第一部当女主的戏)
- 乾隆为何这么喜爱白塔原因是什么(乾隆为何这么喜爱白塔原因是什么)
- 逐渐消失的东北八大怪现象,进步的社会里我们遗失的是什么(逐渐消失的东北八大怪现象)
- 今日大雪,大雪养生这样做,一年都有好气色(大雪养生这样做)
热门推荐
- docker 运行容器命令详细参数详解(Docker Hub运行原理及实现过程解析)
- thinkphp源码上传(ThinkPHP框架实现FTP图片上传功能示例)
- 用html5做一个音乐的播放器(HTML5自定义mp3播放器源码)
- jquery的动画效果api(jQuery框架实现元素显示及隐藏三种动画方式)
- dedecms新手建站教程网页设计(DEDECMS幻灯片中JavaScript实际应用举例)
- mysql查询数据去除重复(MySQL 大批量插入,如何过滤掉重复数据?)
- pyqt左侧菜单栏(pyside+pyqt实现鼠标右键菜单功能)
- python3常见问题(对Python3使运行暂停的方法详解)
- 免费ftp服务器怎么用(几种流行的ftp服务器软件推荐)
- react的基本知识(React中refs的一些常见用法汇总)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9