SET NUMERIC_ROUNDABORT (Transact-SQL)
指定在運算式中因捨入而造成失去精確度時,所產生的錯誤報告層級。
適用於:SQL Server (SQL Server 2008 透過目前版本)、Windows Azure SQL 資料庫 (初始版本,透過目前版本)。 |
語法
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