我收到此錯誤,但僅在按特定列分組時:
Arithmetic overflow error converting expression to data type int.
我無法理解為什么。這是導致它的查詢(求和函式是罪魁禍首):
SELECT a.AtgardAvvattningId,
a.ObjektId,
sum(p.SlutLopLangd - p.StartLopLangd) As TotalLangd
FROM AtgardAvvattning a
INNER JOIN Objekt o ON o.ObjektId = a.ObjektId
INNER JOIN Position p ON p.AvvattningAtgardId = a.AtgardAvvattningId
INNER JOIN Vna v ON v.PositionId = p.PositionId
WHERE v.OID IN (...)
GROUP BY a.AtgardAvvattningId, a.ObjektId, o.AtgardsDatum
ORDER BY a.ObjektId
p.SlutLopLangd 和 p.StartLopLangd 都是 int 列。如果我在求和之前將值轉換為 bigints,它會起作用:
sum(CONVERT(bigint, p.SlutLopLangd - p.StartLopLangd)) As TotalLangd
給出這個結果:
| AtgardAvvattningId | 物件識別符號 | TotalLangd |
|---|---|---|
| DC9... | 9B2... | 25684 |
| 電子病歷... | 9B2... | 25700 |
| 3D0... | 9B2... | 170005 |
| 959... | 9B2... | 170005 |
| 貝... | 214... | 11814 |
| C31... | 214... | 11815 |
如您所見,沒有總和接近 int 的極限。奇怪的是,如果我像這樣在 group by 子句中包含 positionId,它不會引發錯誤:
SELECT a.AtgardAvvattningId,
a.ObjektId,
sum(p.SlutLopLangd - p.StartLopLangd) As TotalLangd
FROM AtgardAvvattning a
INNER JOIN Objekt o ON o.ObjektId = a.ObjektId
INNER JOIN Position p ON p.AvvattningAtgardId = a.AtgardAvvattningId
INNER JOIN Vna v ON v.PositionId = p.PositionId
WHERE v.OID IN (...)
GROUP BY a.AtgardAvvattningId, a.ObjektId, o.AtgardsDatum, p.PositionId
ORDER BY a.ObjektId
在這種情況下,AtgardAvvattning 和 Position 之間是一對一的關系。此查詢給出與上述完全相同的結果。
當值如此之小時,為什么首先會引發算術溢位?為什么它在第二個中起作用?有什么不同?我知道沒有資料和表結構可能很難給出答案,但任何提示都會有所幫助。
更新:
完全使用此查詢洗掉組時:
SELECT a.AtgardAvvattningId,
a.ObjektId,
p.PositionId,
v.VnaId,
p.StartLopLangd,
p.SlutLopLangd,
p.SlutLopLangd - p.StartLopLangd as Subtraction
FROM AtgardAvvattning a
INNER JOIN Objekt o ON o.ObjektId = a.ObjektId
INNER JOIN Position p ON p.AvvattningAtgardId = a.AtgardAvvattningId
INNER JOIN Vna v WITH (NOLOCK) ON v.PositionId = p.PositionId
WHERE v.OID IN (...)
ORDER BY a.ObjektId
結果根本不是很多行:
| AtgardAvvattningId | 物件識別符號 | 職位編號 | VnaId | StartLopLangd | 蕩婦LopLangd | 減法 |
|---|---|---|---|---|---|---|
| DC96... | 9B2... | 473... | 1345183 | 168501 | 174922 | 6421 |
| ECD4... | 9B2... | 07E... | 1252649 | 74602 | 81027 | 6425 |
| ECD4... | 9B2... | 07E... | 1252651 | 74602 | 81027 | 6425 |
| ECD4... | 9B2... | 07E... | 1252652 | 74602 | 81027 | 6425 |
| ECD4... | 9B2... | 07E... | 1252650 | 74602 | 81027 | 6425 |
| DC96... | 9B2... | 473... | 1345180 | 168501 | 174922 | 6421 |
| DC96... | 9B2... | 473... | 1345181 | 168501 | 174922 | 6421 |
| DC96... | 9B2... | 473... | 1345182 | 168501 | 174922 | 6421 |
| 3D08... | 公元前9... | F18... | 1374284 | 199000 | 233001 | 34001 |
| 3D08... | 公元前9... | F18... | 1374283 | 199000 | 233001 | 34001 |
| 9590... | 公元前9... | 二維... | 1374285 | 16591 | 50592 | 34001 |
| 9590... | 公元前9... | 二維... | 1374286 | 16591 | 50592 | 34001 |
| 9590... | 公元前9... | 二維... | 1374287 | 16591 | 50592 | 34001 |
| 9590... | 公元前9... | 二維... | 1374289 | 16591 | 50592 | 34001 |
| 9590... | 公元前9... | 二維... | 1374288 | 16591 | 50592 | 34001 |
| 3D08... | 公元前9... | F18... | 1374281 | 199000 | 233001 | 34001 |
| 3D08... | 公元前9... | F18... | 1374280 | 199000 | 233001 | 34001 |
| 3D08... | 公元前9... | F18... | 1374282 | 199000 | 233001 | 34001 |
| C31B... | 214... | B20... | 1349999 | 32756 | 44571 | 11815 |
| BEC3... | 214... | F21... | 1349998 | 205022 | 216836 | 11814 |
但是,您對行求和,應該很難達到 int 溢位限制。
uj5u.com熱心網友回復:
最終值實際上并不重要。可能發生的情況是,在您的某個時刻,您SUM會超過最大值 (2,147,483,647) 或最小值 (-2,147,483,648)int并得到錯誤。
舉個例子:
SELECT SUM(V.I)
FROM (VALUES(2147483646),
(2),
(-2006543543))V(I);
這可能會產生相同的錯誤:
將運算式轉換為資料型別 int 時出現算術溢位錯誤。
然而,結果SUM將是 140,940,105(遠低于最大值)。這是因為如果 2147483646先將和2相加,則得到2147483648,它大于 a 的最大值int。如果您先CAST/CONVERT值,則不會收到錯誤訊息:
SELECT SUM(CONVERT(bigint,V.I))
FROM (VALUES(2147483646),
(2),
(-2006543543))V(I);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/416740.html
標籤:
下一篇:向時間序列對添加過濾器
