将 varchar 转换为数据类型 numeric 时出现算术溢出错误。

zhangzhen_927116 2012-07-12 02:28:09

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER function [dbo].[f_cid]
(
@BOMNO varchar(100),
@liqty varchar(100)
)
returns @t_level table
(
P_CODE varchar(100),
CODE varchar(100),
CBDESC nvarchar(100),
QTY_NEED numeric(6,2),
WASTAGE numeric(6,2),
UNIT nvarchar(20),
LIQYT numeric(10,5),
level int,level1 varchar(8000)
)
as
begin
declare @level int
declare @level1 int

set @level = 1
set @level1 = '0'

insert into @t_level select P_CODE,CODE,CBDESC,QTY_NEED,(WASTAGE/100)WASTAGE,UNIT,
ceiling((@liqty+(@liqty*(WASTAGE/100)))*QTY_NEED)LIQYT,@level,@level1
from BOMT where BOMT.BOMNO=@BOMNO
while @@ROWCOUNT > 0
begin
set @level = @level + 1

insert into @t_level select a.P_CODE,a.CODE,a.CBDESC,a.QTY_NEED,(a.WASTAGE+b.WASTAGE),a.UNIT,ceiling((b.LIQYT+(b.LIQYT*(a.WASTAGE/100)))*a.QTY_NEED)LIQYT,@level,

case when (select count(*) from BOMT c where a.P_CODE=c.P_CODE and c.CODE>a.CODE and c.CODE<>@BOMNO)=0
then b.level1+'-000'
else b.level1+'-'+right('00'+ltrim((select count(*) from BOMT c where a.P_CODE=c.P_CODE and c.CODE>a.CODE and c.CODE<>@BOMNO)),3)
end

from BOMT a , @t_level b
where a.P_CODE = b.CODE and b.level = @level - 1 and a.CODE<>@BOMNO

end
return
end








select REPLICATE('',level-1)+ltrim(level)ID ,CODE,CBDESC,QTY_NEED,UNIT,WASTAGE,('10000'*QTY_NEED*(WASTAGE/100))SHS,LIQYT from f_cid

('WI-EGD-4740','10000') order by level1,level

当我把数量改成10000一下就可以。。。上了10000就不行了。。这是什么原因啊。。
...全文
7117 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
shinger126 2012-07-13
  • 打赏
  • 举报
回复
你的字段类型是numeric(10,5),就是说整数部分只有5位,插入100000肯定不行了
zhangzhen_927116 2012-07-12
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
引用 10 楼 的回复:

引用 7 楼 的回复:
select ceiling('100000'+10.0001)

这条语句会报下面的error
Msg 8115, Level 16, State 8, Line 1
Arithmetic overflow error converting varchar to data type numeric.

也就是由于某种原因你造成……
[/Quote]
对了。。就是这个地方。。。谢谢了。。也谢谢上面给我解答的。。
quchen520 2012-07-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

引用 7 楼 的回复:
select ceiling('100000'+10.0001)

这条语句会报下面的error
Msg 8115, Level 16, State 8, Line 1
Arithmetic overflow error converting varchar to data type numeric.

也就是由于某种原因你造成了,数据库不能隐式转换的情况……
[/Quote]


...
ceiling((@liqty+(@liqty*(WASTAGE/100)))*QTY_NEED)LIQYT,@level,@level1
...
这个地方参数@liqty是varchar类型转换成NUMERIC类型试试
NET_2011 2012-07-12
  • 打赏
  • 举报
回复
先转换字符串再做加减
NET_2011 2012-07-12
  • 打赏
  • 举报
回复
select CEILING(CAST('100000' AS BIGINT)+10.0001 )
zhangzhen_927116 2012-07-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
select ceiling('100000'+10.0001)

这条语句会报下面的error
Msg 8115, Level 16, State 8, Line 1
Arithmetic overflow error converting varchar to data type numeric.

也就是由于某种原因你造成了,数据库不能隐式转换的情况,所以才会报错
[/Quote]
就是这样的情况 。。。那怎么改善呢。。。
NET_2011 2012-07-12
  • 打赏
  • 举报
回复
当我把数量改成10000一下就可以。。。上了10000就不行了。。这是什么原因啊。。
--------------
超过了类型范围,可用先不运算select 查看一下结果
NET_2011 2012-07-12
  • 打赏
  • 举报
回复
在查询执行过程中发生溢出或被零除错误时,终止查询。

参照是否以下情况
-- SET ARITHABORT
-------------------------------------------------------------------------------
-- Create tables t1 and t2 and insert data values.
CREATE TABLE t1 (
a TINYINT,
b TINYINT
);
CREATE TABLE t2 (
a TINYINT
);
GO
INSERT INTO t1
VALUES (1, 0);
INSERT INTO t1
VALUES (255, 1);
GO

PRINT '*** SET ARITHABORT ON';
GO
-- SET ARITHABORT ON and testing.
SET ARITHABORT ON;
GO

PRINT '*** Testing divide by zero during SELECT';
GO
SELECT a / b AS ab
FROM t1;
GO

PRINT '*** Testing divide by zero during INSERT';
GO
INSERT INTO t2
SELECT a / b AS ab
FROM t1;
GO

PRINT '*** Testing tinyint overflow';
GO
INSERT INTO t2
SELECT a + b AS ab
FROM t1;
GO

PRINT '*** Resulting data - should be no data';
GO
SELECT *
FROM t2;
GO

-- Truncate table t2.
TRUNCATE TABLE t2;
GO

-- SET ARITHABORT OFF and testing.
PRINT '*** SET ARITHABORT OFF';
GO
SET ARITHABORT OFF;
GO

-- This works properly.
PRINT '*** Testing divide by zero during SELECT';
GO
SELECT a / b AS ab
FROM t1;
GO

-- This works as if SET ARITHABORT was ON.
PRINT '*** Testing divide by zero during INSERT';
GO
INSERT INTO t2
SELECT a / b AS ab
FROM t1;
GO
PRINT '*** Testing tinyint overflow';
GO
INSERT INTO t2;
SELECT a + b AS ab
FROM t1;
GO

PRINT '*** Resulting data - should be 0 rows';
GO
SELECT *
FROM t2;
GO

-- Drop tables t1 and t2.
DROP TABLE t1;
DROP TABLE t2;
GO
quchen520 2012-07-12
  • 打赏
  • 举报
回复
select ceiling('100000'+10.0001)

这条语句会报下面的error
Msg 8115, Level 16, State 8, Line 1
Arithmetic overflow error converting varchar to data type numeric.

也就是由于某种原因你造成了,数据库不能隐式转换的情况,所以才会报错
zhangzhen_927116 2012-07-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
肯定是你那个数据类型不同 你却直接操作。。
[/Quote]
我上面些了。。如果数据类型不同。。那么不管是那个数都应该是有错误的。。但是现在问题是上了10000就不行。。低于10000就行。。。好像不支持10000以上一样。
zhangzhen_927116 2012-07-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
select REPLICATE('',level-1)+ltrim(level)ID ,CODE,CBDESC,QTY_NEED,UNIT,WASTAGE,(10000*QTY_NEED*(WASTAGE/100))SHS,LIQYT from f_cid

('WI-EGD-4740','10000') order by level1,level
这里改成直接INT.
还有可能是你把……
[/Quote]
应该不会啊。。。。我把数量改小它就行。。上了10000就不行了。如果插入到numeric列那么应该10000一下也不行的啊 。。。
勿勿 2012-07-12
  • 打赏
  • 举报
回复
肯定是你那个数据类型不同 你却直接操作。。
SQL77 2012-07-12
  • 打赏
  • 举报
回复
select REPLICATE('',level-1)+ltrim(level)ID ,CODE,CBDESC,QTY_NEED,UNIT,WASTAGE,(10000*QTY_NEED*(WASTAGE/100))SHS,LIQYT from f_cid

('WI-EGD-4740','10000') order by level1,level
这里改成直接INT.
还有可能是你把VARCHAR值插入到NUMERIC的列了.仔细检查一下


zhangzhen_927116 2012-07-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
你计算的这个字段值,最后插入表格,表格中定义的相对应字段范围太小。

你要插入LIQYT吧,你定义的是 numeric(10,5), 换成更大范围就行, 比如 numeric(15,5),
[/Quote]
没用。。我都设置到20了还是不行。。。
shoppo0505 2012-07-12
  • 打赏
  • 举报
回复
你计算的这个字段值,最后插入表格,表格中定义的相对应字段范围太小。

你要插入LIQYT吧,你定义的是 numeric(10,5), 换成更大范围就行, 比如 numeric(15,5),

22,209

社区成员

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

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