社区
疑难问题
帖子详情
一个奇怪的问题?
fzc20031210
2004-05-08 09:01:10
select 1.0*right(269,1)和select 1.0*right(269,2)两个SQL语句为什么第一个执行正确,而第二个提示"不能转换为NUMERIC类型"?
select right(469,1)+left(998,2)+2执行后结果为1001,为什么结果不是110?
...全文
105
16
打赏
收藏
一个奇怪的问题?
select 1.0*right(269,1)和select 1.0*right(269,2)两个SQL语句为什么第一个执行正确,而第二个提示"不能转换为NUMERIC类型"? select right(469,1)+left(998,2)+2执行后结果为1001,为什么结果不是110?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
16 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
8992026
2004-05-08
打赏
举报
回复
只有一个结论:
尽量不要让sql server自动转化数据类型,而是自己显式的转换
8992026
2004-05-08
打赏
举报
回复
select 9.99*'69.1'
也出错
8992026
2004-05-08
打赏
举报
回复
那sql server有点弱智了,varchar(2)为什么不自动转化成numeric(3,1)而要转化成numeric(2,1),自动转化就出错了
zjcxc
2004-05-08
打赏
举报
回复
select 1.0*69/2
--你看结果,实际是全部转换成float类型在计算
zjcxc
2004-05-08
打赏
举报
回复
--这是纯数字的计算,与有字符串的数据类型的确定方式又不同.
1.0*69/2
8992026
2004-05-08
打赏
举报
回复
select 1.0*right(269,2) 将 numeric 转换为数据类型 numeric 时发生算术溢出错误。
select 0.1*right(269,2) 将 numeric 转换为数据类型 numeric 时发生算术溢出错误。
select 0.01*right(269,2) 将 numeric 转换为数据类型 numeric 时发生算术溢出错误。
select 0.0001*right(269,2) 将 numeric 转换为数据类型 numeric 时发生算术溢出错误。
select 9.99999999*right(269,2) 将 numeric 转换为数据类型 numeric 时发生算术溢出错误。
select 10.0*right(269,2) 690.00
fzc20031210
2004-05-08
打赏
举报
回复
1.0*69/2为什么不会产生溢出?
zjcxc
2004-05-08
打赏
举报
回复
--你看下面的,结果都能正确,就是因为后面的转换是依据前面的numiric类型
select 1.0*right(269,1) --1.0,对应的类型是numeric(2,1)
,11.0*right(269,2) --11.0,对应的类型是numeric(3,1)
,111.0*right(269,3) --111.0,对应的类型是numeric(4,1)
zjcxc
2004-05-08
打赏
举报
回复
不是转换成int,而是转换成numeric(2,1)
--再取后两位69,因为要乘,转化为前面的那种类型:numeric(2,1)
fzc20031210
2004-05-08
打赏
举报
回复
1.0的数据类型自动当作numeric(2,1)了,那1为NUMERIC(1,0),与69相乘不也溢出了,我有点昏,请再解释一下?马上送分
8992026
2004-05-08
打赏
举报
回复
问题变复杂了:
select 1.0*right(269,1) 9.00
select 2.0*right(269,1) 18.00
select 9.0*right(269,1) 81.00
select 99.0*right(269,1) 891.00
都不出错
zjcxc
2004-05-08
打赏
举报
回复
--把你的意思写成语句,就是这样,你执行这句,是可以出结果的:
select 1.0*cast(right(269,2) as int)
8992026
2004-05-08
打赏
举报
回复
版主:那转化成什么?还是不转化?
zjcxc
2004-05-08
打赏
举报
回复
楼上,我觉得你的解释有点问题:
select 1.0*right(269,2)
1.0的数据类型自动当作numeric(2,1)了 --***同意
right(269,2)先把269转化成varchar --**同意
--再取后两位69,因为要乘,有转化为int --**这点不同意
8992026
2004-05-08
打赏
举报
回复
我慢慢解释给你听:
select 1.0*right(269,2)
1.0的数据类型自动当作numeric(2,1)了
right(269,2)先把269转化成varchar,再取后两位69,因为要乘,有转化为int
1.0*right(269,2) numeric(2,1)的1乘以整数69后溢出了numeric(2,1),出错
可以这么代替
select cast(1.0 as numeric(10,2))*right(269,2)
select right(469,1)+left(998,2)+2执行后结果为1001,为什么结果不是110
如上解释right(469,1)结果是varchar的9
left(998,2)结果是varchar的99
varchar的9+varchar的99=varchar的999 ,因为要加整数2自动转化成整数999
999+2=?,当然是1001
试试
select cast(right(469,1) as int)+left(998,2)+2
fzc20031210
2004-05-08
打赏
举报
回复
up
PL/SQL传参中
一个
很
奇怪
的
一个
问题
本文探讨了在使用PL/SQL时遇到的
一个
奇怪
问题
,即参数在调用SQL文件过程中导致文件名生成出现歧义。通过分析SQL文件结构和参数传递方式,解释了
问题
原因,并提供了解决方案。
一个
奇怪
的sql server profiler
问题
本文记录了
一个
关于 SQL Server Profiler 的
奇怪
问题
,虽然错误已无法重现,但作者分享了通过重启 SQL Server 服务解决
问题
的过程。
遇到
一个
奇怪
的
问题
,关于laydate()初始化的
问题
博主在前端开发中遇到了laydate时间插件的
一个
奇怪
问题
:首次使用laydate正常,但在后续动态添加行并初始化时间插件时,第二次及以后的选择功能出现异常。具体表现为第一次未选择时间后,第二次无法再进行时间选择。
问题
似乎与动态生成的ID和插件初始化有关。
一个
awk的
奇怪
问题
在CentOS8,Ubuntu8.0,CentOS7.9及Kali2022上,
一个
奇怪
的bug出现:当改变列打印顺序时,会出现占位
问题
。此
问题
在Xshell和云服务器控制台中重现,但其他环境正常,可能与字符集设置有关。尽管不同版本的CentOS现象一致,
问题
仍未解决。
一个
很
奇怪
的
问题
本文探讨了在C语言中使用位运算时遇到的
一个
奇怪
问题
:两种不同的方式将两个字节的数据组合成
一个
16位整数。通过对比两种方法,揭示了位移运算符与加号运算符之间的优先级差异,并提供了正确的实现方式。
疑难问题
22,297
社区成员
121,728
社区内容
发帖
与我相关
我的任务
疑难问题
MS-SQL Server 疑难问题
复制链接
扫一扫
分享
社区描述
MS-SQL Server 疑难问题
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章