SET NUMERIC_ROUNDABORT (Transact-SQL)
指定当表达式中的舍入导致精度损失时生成的错误报告级别。
适用范围:SQL Server(SQL Server 2008 至当前版本),Windows Azure SQL Database(初始版本至当前版本)。 |
语法
SET NUMERIC_ROUNDABORT { ON | OFF }
注释
当 SET NUMERIC_ROUNDABORT 为 ON 时,在表达式中出现精度损失时将生成错误。 当设置为 OFF 时,精度损失不生成错误信息,并且将结果舍入为存储结果的列或变量的精度。
在精度较低的列或变量中,当尝试以固定精度存储值时,会出现精度损失。
如果 SET NUMERIC_ROUNDABORT 为 ON,则 SET ARITHABORT 决定生成错误的严重级别。 该表显示当出现精度损失时这两个设置的效果。
设置 |
SET NUMERIC_ROUNDABORT ON |
SET NUMERIC_ROUNDABORT OFF |
---|---|---|
SET ARITHABORT ON |
生成错误;不返回结果集。 |
没有错误和警告;对结果进行舍入。 |
SET ARITHABORT OFF |
返回警告;表达式返回 NULL。 |
没有错误和警告;对结果进行舍入。 |
SET NUMERIC_ROUNDABORT 的设置是在执行或运行时设置,而不是在分析时设置。
在对计算列或索引视图创建或更改索引时,SET NUMERIC_ROUNDABORT 必须为 OFF。 如果 SET NUMERIC_ROUNDABORT 为 ON,则用于计算列或索引视图中带索引的表的 CREATE、UPDATE、INSERT 和 DELETE 语句将失败。 有关计算列的索引视图和索引必需的 SET 选项设置的详细信息,请参阅 SET 语句 (Transact-SQL) 中的“使用 SET 语句时的注意事项”。
要查看此设置的当前设置,请运行以下查询。
DECLARE @NUMERIC_ROUNDABORT VARCHAR(3) = 'OFF';
IF ( (8192 & @@OPTIONS) = 8192 ) SET @NUMERIC_ROUNDABORT = 'ON';
SELECT @NUMERIC_ROUNDABORT AS NUMERIC_ROUNDABORT;
权限
要求具有 public 角色成员资格。
示例
以下示例显示将两个精度为四位小数的值添加并存储在一个精度为两位小数的变量中。 这些表达式演示了不同的 SET NUMERIC_ROUNDABORT 和 SET ARITHABORT 设置所造成的影响。
-- SET NOCOUNT to ON,
-- SET NUMERIC_ROUNDABORT to ON, and SET ARITHABORT to ON.
SET NOCOUNT ON;
PRINT 'SET NUMERIC_ROUNDABORT ON';
PRINT 'SET ARITHABORT ON';
SET NUMERIC_ROUNDABORT ON;
SET ARITHABORT ON;
GO
DECLARE @result DECIMAL(5, 2),
@value_1 DECIMAL(5, 4),
@value_2 DECIMAL(5, 4);
SET @value_1 = 1.1234;
SET @value_2 = 1.1234 ;
SELECT @result = @value_1 + @value_2;
SELECT @result;
GO
-- SET NUMERIC_ROUNDABORT to ON and SET ARITHABORT to OFF.
PRINT 'SET NUMERIC_ROUNDABORT ON';
PRINT 'SET ARITHABORT OFF';
SET NUMERIC_ROUNDABORT ON;
SET ARITHABORT OFF;
GO
DECLARE @result DECIMAL(5, 2),
@value_1 DECIMAL(5, 4),
@value_2 DECIMAL(5, 4);
SET @value_1 = 1.1234;
SET @value_2 = 1.1234 ;
SELECT @result = @value_1 + @value_2;
SELECT @result;
GO
-- SET NUMERIC_ROUNDABORT to OFF and SET ARITHABORT to ON.
PRINT 'SET NUMERIC_ROUNDABORT OFF';
PRINT 'SET ARITHABORT ON';
SET NUMERIC_ROUNDABORT OFF;
SET ARITHABORT ON;
GO
DECLARE @result DECIMAL(5, 2),
@value_1 DECIMAL(5, 4),
@value_2 DECIMAL(5, 4);
SET @value_1 = 1.1234;
SET @value_2 = 1.1234 ;
SELECT @result = @value_1 + @value_2;
SELECT @result;
GO
-- SET NUMERIC_ROUNDABORT to OFF and SET ARITHABORT to OFF.
PRINT 'SET NUMERIC_ROUNDABORT OFF';
PRINT 'SET ARITHABORT OFF';
SET NUMERIC_ROUNDABORT OFF;
SET ARITHABORT OFF;
GO
DECLARE @result DECIMAL(5, 2),
@value_1 DECIMAL(5, 4),
@value_2 DECIMAL(5, 4);
SET @value_1 = 1.1234;
SET @value_2 = 1.1234;
SELECT @result = @value_1 + @value_2;
SELECT @result;
GO