一个奇怪的问题?

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?


...全文
14 16 点赞 打赏 收藏 举报
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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相乘不也溢出了,我有点昏,请再解释一下?马上送分
  • 打赏
  • 举报
回复
zjcxc 2004-05-08
--把你的意思写成语句,就是这样,你执行这句,是可以出结果的:

select 1.0*cast(right(269,2) as int)
  • 打赏
  • 举报
回复
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
都不出错


  • 打赏
  • 举报
回复
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
  • 打赏
  • 举报
回复
相关推荐
发帖
疑难问题
加入

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2004-05-08 09:01
社区公告
暂无公告