星期四, 7月 30, 2026

[SQL] 隱含轉換 - 彙總函數回傳值資料型態

一段 sum 並把結果 insert 進 Table TSQL 語法,拋出下面錯誤訊息
結果的空間不足,無法將 money (貨幣) 值轉換成 smallmoney。
該欄位資料型態是 smallmoeny,很明顯是 sum 結果超過 smallmoney 資料範圍導致的異常,samllint 資料範圍在 -214,748.3648 到 214,748.3647 之間,但意外的是為什麼針對 smallmoney 欄位進行 sum 時是回傳 moeny 資料型態
官方文件 - sum return type 內有說明,彙總函式 sum 結果會發生資料型態隱含轉換,以該例來看就是 sum 把 smallmoney 資料彙總時,因為彙總結果超過 smallmoney 資料範圍,所以隱含轉換為 money,insert 回 smallmoney 欄位時拋出錯誤
簡易範例驗證
use tempdb
GO

DROP TABLE IF EXISTS tblDemo

CREATE TABLE tblDemo
(
	ID int identity(1,1) ,
	ColSmallMoney smallmoney
)

INSERT INTO tblDemo (ColSmallMoney) VALUES(214748)
INSERT INTO tblDemo (ColSmallMoney) VALUES(214748)
GO

SELECT 
	SQL_VARIANT_PROPERTY(SUM(ColSmallMoney) , 'BaseType') -- 會得到 money 資料型態
FROM tblDemo

沒有留言:

張貼留言