在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 中的数据类型隐式转换问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对开心学习网网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
- sysbenchmysql性能跑分(MySQL性能压力基准测试工具sysbench的使用简介)
- 数据库sql语句大全及例题(数据库之SQL技巧整理案例)
- sql常遇到的问题(SQL语句执行超时引发网站首页访问故障问题)
- SQL Server中查询CPU占用高的SQL语句
- python下的sql处理(python中aioysql异步操作MySQL的方法)
- sql server中有哪几种锁定模式(SQL Server三种锁定模式的知识讲解)
- SQL Server中的临时表的用法
- mysql判断表中字段是否存在(mysql插入前判断数据是否存在的操作)
- mysql高级概念(MySQL 自定义变量的概念及特点)
- mysql char和varchar区别(MySQL CHAR和VARCHAR存储、读取时的差别)
- 怎样查看mysql的ddl窗口(详解MySQL8.0原子DDL语法)
- SQL Server 2008中的时间数据类型
- sql语句计算年龄(sql通过日期判断年龄函数的示例代码)
- 怎么新建数据库登录名用sql语句(T-sql语句修改SQL Server数据库逻辑名、数据库名、物理名的方法)
- sqlserverlog原理(sql server中错误日志errorlog的深入讲解)
- 如何查看mysql慢查询日志(MySQL慢查询如何定位详解)
- 8月23日11时16分将迎处暑,逐渐进入气象意义上的秋天(8月23日11时16分将迎处暑)
- 花不语 下 如果重来一次的话,你还会这么选择吗(花不语下如果重来一次的话)
- 城市记忆之上海 最难忘的是老弄堂里的市井味道(城市记忆之上海)
- 太鸡贼了,这老小区轻松搞定了停车问题(这老小区轻松搞定了停车问题)
- 太鸡贼了,这老小区轻松搞定了停车问题(这老小区轻松搞定了停车问题)
- 节日我在岗|警景相融 平安相伴(节日我在岗警景相融)
热门推荐
- yii2对比springboot(yii2.0框架使用 beforeAction 防非法登陆的方法分析)
- dedecms标签调用大全(织梦cms图集{dede:field name='imgurls'}显示栏目名称)
- mybatis如何插入空格字符串(MyBatis SQL xml处理小于号与大于号正确的格式)
- qgis 如何平滑折线(Sqlview动态发布地图图层的方法)
- css渐变有几种(CSS 还能这样玩?奇思妙想渐变的艺术)
- laravel获取数据(laravel 判断查询数据库返回值的例子)
- mysql 高效分页(MySQL 分页查询的优化技巧)
- zabbixagent安装教程(zabbix-agent在麒麟V10上的安装过程)
- linuxftp的下载命令(Linux ftp 命令行中下载文件get与上传文件put的命令应用详解)
- asp.net MVC处理流程
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9