decimal 和 numeric (Transact-SQL)

適用于:yesSQL Server (所有支援的版本 Yes) Azure SQL Database Yes Azure SQL 受控執行個體 yes Azure Synapse Analytics Analytics yes Platform System (PDW)

具有固定有效位數和小數位數的數值資料類型。 Decimal 和 numeric 是同義字,可以交換使用。

引數

decimal[ (p[ ,s] ) ] 和 numeric[ (p[ ,s] ) ]
固定有效位數和小數位數的數字。 當使用最大有效位數時,有效的值是從 - 10^38 +1 到 10^38 - 1。 decimal 的 ISO 同義字為 decdec(p, s)numeric 在功能上與 decimal 相同。

p (有效位數)
要儲存的最大小數位數總數。 此數目包括小數點的左右兩側。 有效位數必須是從 1 到最大有效位數 38 的值。 預設有效位數是 18。

注意

Informatica 只支援 16 個有效數字,無論指定的有效位數和小數位數為何。

s (小數位數)
小數點右側所能儲存的小數位數。 這個數字會從 p 中減去,以判斷小數點左邊的最大位數。 小數位數必須是介於 0 到 p 間的值,且只能在已指定有效位數時指定。 預設小數位數為 0,因此 0 < = s< = p。 最大儲存體大小會隨著有效位數而不同。

Precision 儲存體位元組
1 - 9 5
10-19 9
20-28 13
29-38 17

注意

Informatica (透過 SQL Server PDW Informatica Connector 連線) 只支援 16 個有效數字,無論指定的有效位數和小數位數為何。

轉換 decimal 與 numeric 資料

針對十進位數值資料類型,SQL Server會將有效位數和小數位數的每個組合視為不同的資料類型。 例如,decimal(5,5)decimal(5,0) 會視為是不同的資料類型。

在 Transact-SQL 語句中,具有小數點的常數會使用所需的最小有效位數和小數位數自動轉換成數值值。 例如,常數 12.345 會轉換成有效位數 5、小數位數 3 的 numeric 值。

decimalnumeric 轉換成 floatreal 可能會導致有效位數的遺失。 從 intsmallinttinyintfloatrealmoney,或 smallmoney 轉換成 decimalnumeric 可能會導致溢位。

根據預設,SQL Server將數位轉換成小數點數值時,會使用四捨五入,其有效位數和小數位數較低。 相反地,如果 SET ARITHABORT 選項為 ON,SQL Server發生溢位時引發錯誤。 只是流失有效位數與小數位數還不足以產生錯誤。

在 SQL Server 2016 (13.x) 之前,將浮點數轉換成十進位值或數值僅限於有效位數 17 位數的值。 任何小於 5E-18 (當設定使用 5E-18 科學記號標記法或 0.0000000000000000050000000000000005 十進位標記法時) 的 float 值都會捨去為 0。 截至 2016 SQL Server 2016 (13.x) 為止,這不是限制。

範例

下列範例會使用 decimalnumeric 資料類型建立資料表。 值會插入至每個資料行。 結果會使用 SELECT 陳述式傳回。

CREATE TABLE dbo.MyTable  
(  
  MyDecimalColumn DECIMAL(5,2)  
,MyNumericColumn NUMERIC(10,5)
  
);  
  
GO  
INSERT INTO dbo.MyTable VALUES (123, 12345.12);  
GO  
SELECT MyDecimalColumn, MyNumericColumn  
FROM dbo.MyTable;  
  

以下為結果集。

MyDecimalColumn                         MyNumericColumn  
--------------------------------------- ---------------------------------------  
123.00                                  12345.12000  
  
(1 row(s) affected)  
  

另請參閱

ALTER TABLE (Transact-SQL)
CAST 和 CONVERT (Transact-SQL)
CREATE TABLE (Transact-SQL)
DECLARE @local_variable (Transact-SQL)
SET @local_variable (Transact-SQL)
sys.types (Transact-SQL)