ОК, я знаю, что уже ответил на lad2025..but..only половине этого (для меня по крайней мере) .. только его ответьте, как исправить это не причина ..
Из-за моего любопытства, я делаю свое собственное исследование по этому вопросу. После чтения прогиб Precision, Scale, and Length и попробуйте SQL, я обнаружил, что NUMERIC (p, s) при умножении произведет новый числовые с новой точностью и шкалой:
p1 + p2 + 1
s1 + s2
приближение проблемой является произойти, когда P1 + P2 + 1 более 38, максимальный сервер точности SQL может иметь, точность установлена на 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. Дело в том, что я не знаю, было ли это преднамеренным или ошибка.
«как это можно исправить?» - прекратите запрашивать большие типы данных с большими требованиями к точности, если они вам не нужны/не нужны. –
@Damien_The_Unbeliever - Это просто мои данные в реальном времени очень большие. –