【问题标题】:SQL server 2008 R2 Arithmetic overflow error converting numeric to data type numericSQL server 2008 R2 将数字转换为数据类型数字的算术溢出错误
【发布时间】:2014-04-03 18:43:19
【问题描述】:

我在 SQL Server 2008 R2 上遇到了一个我无法理解的令人困惑的错误。

但是当我在本地服务器(SQL Server 2008 R2 也是)上尝试相同的请求时,一切正常。

所以这是提出问题的请求:

select cast(cast(1.260 as numeric(13,3)) as numeric(10,2))

我还添加了一些查询的结果,指示每个服务器的环境:

在本地服务器上:

---------------------------------------
1.26

(1 row(s) affected)

Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (X64) 
    Apr 22 2011 19:23:43 
    Copyright (c) Microsoft Corporation
    Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

ARITHABORT
---------------------------------------------------------------------------------------------
1

(1 row(s) affected)

ARITHIGNORE
---------------------------------------------------------------------------------------------
NULL

(1 row(s) affected)

ANSI_WARNINGS
---------------------------------------------------------------------------------------------
1

(1 row(s) affected)

在远程服务器上:

消息 8115,第 16 级,状态 7,第 1 行
将数值转换为数值数据类型时出现算术溢出错误。

Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) 
    Jun 17 2011 00:54:03 
    Copyright (c) Microsoft Corporation
    Enterprise Edition (64-bit) on Windows NT 6.0 <X64> (Build 6002: Service Pack 2) (Hypervisor)
(1 row(s) affected)

ARITHABORT
------------------------------------------------------------------------------------------------------------
1

(1 row(s) affected)

ARITHIGNORE
------------------------------------------------------------------------------------------------------------
NULL

(1 row(s) affected)

ANSI_WARNINGS
------------------------------------------------------------------------------------------------------------
1

(1 row(s) affected)

我的问题是如何重现远程服务器上发生的问题。如您所见,参数 ARITH... 和 ANSI_.. 在两台服务器上都是相同的。 SQL Server 上是否有针对此类错误的配置?

【问题讨论】:

  • 我在具有相同版本(10.50.2500.0)的另一台(生产)远程服务器上尝试了相同的请求,并且没有错误。

标签: sql-server-2008-r2


【解决方案1】:

NUMERIC_ROUNDABORT 选项打开

当 SET NUMERIC_ROUNDABORT 为 ON 时,表达式中出现精度损失后会生成错误。关闭时,精度损失不会生成错误消息,结果会四舍五入到存储结果的列或变量的精度。

通常这是关闭的,因为当打开索引视图等时可能会失败。

我从来没有改变过这一点。

SET NOCOUNT ON;
GO
PRINT 'ON'
set NUMERIC_ROUNDABORT ON;
select cast(cast(1.260 as numeric(13,3)) as numeric(10,2));
GO
PRINT 'OFF'
set NUMERIC_ROUNDABORT OFF;
select cast(cast(1.260 as numeric(13,3)) as numeric(10,2));
GO

给予

ON

---------------------------------------
Msg 8115, Level 16, State 7, Line 3
Arithmetic overflow error converting numeric to data type numeric.

OFF

---------------------------------------
1.26

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 2013-05-27
  • 2014-02-11
相关资源
最近更新 更多