在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实现mvc(mysql的MVCC多版本并发控制的实现)
- mysql超大表加字段(MySQL 大表添加一列的实现)
- mysqldump备份缺点(MySQL5.7 mysqldump备份与恢复的实现)
- sql server 新函数(SQL Server分隔函数实例详解)
- sql server2008无法连接怎么办(SQL Server 2008 R2登录失败的解决方法)
- mysql创建表存在哪里(MySQL的表空间是什么)
- 设置mysql字符集语句(MySQL修改字符集的实战教程)
- ubuntu下mysql安装教程(Ubuntu 20.04 安装和配置MySql5.7的详细教程)
- sql 查询结果别名(SQL查询中需要使用别名问题)
- mysql设计规则(专业级的MySQL开发设计规范及SQL编写规范)
- sql server 2012 错误5123(SQL SERVER 9003错误解决方法)
- mysql能groupby两个字段吗(MySQL group by语句如何优化)
- MySQL定时任务(EVENT事件)如何配置详解(MySQL定时任务EVENT事件如何配置详解)
- SQL如何操作Xml字段
- sqlserver 锁表原因(SQL Server学习笔记之事务、锁定、阻塞、死锁用法详解)
- mysql 存储引擎有哪些(MySQL 常见存储引擎的优劣)
- 直播带货能赚到很多钱吗(直播带货能赚到很多钱吗现在)
- 做网红真的很能赚钱吗(做网红真的很能赚钱吗)
- 10句英语常用(英语常用900句)
- 爱情能当饭吃吗(爱情能当饭吃吗说说)
- 白T恤穿法(白t恤)
- 你怎么忘了是说先爱我(你怎么忘了如何爱我)
热门推荐
- python列表的循环遍历使用教程(Python中使用遍历在列表中添加字典遇到的坑)
- 云主机的优势是什么(云主机有哪些用途和优势)
- 网站自动备份工作简报(网站数据自动备份方法)
- 网络虚拟机系统安装教程(NPOINT免费虚拟主机管理系统windows2003的安装方法)
- docker进入容器内部后的命令(Docker部署Consul配置过程解析)
- css的背景图的平铺方式有哪几种(纯CSS实现hover图片pop-out弹出效果的实例代码)
- sql server2012表的数据删除(SQL Server删除表及删除表中数据的方法)
- vsftpd详细配置(vsftpd匿名用户上传和下载的配置方法)
- mysql怎么把行变列(MySQL 中行转列的方法)
- 如何搭建个人网盘dedecms(linux和windows主机实现dedecms伪静态)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9