OK,我知道它已經通過它的lad2025..but..only回答一半(至少對我來說)..其唯一的回答如何修復它不是原因..
由於我的好奇心,我做了我自己的研究...在讀谷Precision, Scale, and Length並嘗試一些SQL我發現NUMERIC(p,s)倍增時會產生新的具有新的精度和尺度的數字:
p1 + p2 + 1
s1 + s2
的近似問題是當P1 + P2 + 1超過38,最大精度SQL Server可以有,精度設定爲38,但所證明下面
規模減少1的發生
DECLARE
@a NUMERIC(20, 5) = 0.12345,
@b NUMERIC(20, 2) = 0.13,
@c NUMERIC(10, 5) = 0.12345,
@d NUMERIC(10, 2) = 0.13
SELECT 0.12345 * 0.13 Result, @a * @b AxB, @c * @d CxD
結果:
+-----------+----------+-----------+
| Result | AxB | CxD |
+-----------+----------+-----------+
| 0.0160485 | 0.016049 | 0.0160485 |
+-----------+----------+-----------+
AXB給錯誤導致其原有的精度LY超過38和CXD給人以21個精密正確的答案,與sys.dm_exec_describe_first_result_set
SELECT '@a * @b', system_type_name
FROM sys.dm_exec_describe_first_result_set(
N'DECLARE @c NUMERIC(20, 5) = 0.12345, @d NUMERIC(20, 2) = 0.13
SELECT @c * @d', NULL, 0)
UNION ALL
SELECT '@c * @d', system_type_name
FROM sys.dm_exec_describe_first_result_set(
N'DECLARE @c NUMERIC(10, 5) = 0.12345, @d NUMERIC(10, 2) = 0.13
SELECT @c * @d', NULL, 0)
結果進一步檢查:
+-----------+------------------+
| operation | system_type_name |
+-----------+------------------+
| @a * @b | numeric(38,6) |
| @c * @d | numeric(21,7) |
+-----------+------------------+
下表顯示了@a * @b規模減少。 事情是我不知道這個故意還是一個bug ..
「如何修復?」 - 當您不需要/不需要時,請停止詢問具有較高精度要求的大型數據類型。 –
@Damien_The_Unbeliever - 這些僅僅是我的實時數據非常大的例子。 –