一个奇怪的问题?

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?


...全文
49 16 打赏 收藏 转发到动态 举报
写回复
用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

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧