Это больше похоже на «функцию» функции CONVERT
, чем что-либо, имеющее отношение к SELECT
или UPDATE
(единственная причина, по которой она отличается, заключается в том, что UPDATE
неявно преобразует FLOAT(8)
, возвращаемое ABS(...)
обратно в VARCHAR
).
Вычислительный скаляр в плане обновления содержит выражение
[Expr1003] = Scalar Operator(CONVERT_IMPLICIT(varchar(2048),
abs(CONVERT_IMPLICIT(float(53),[TEST],0))
,0) /*<-- style used for convert from float*/
)
Значение - Выход
0 (по умолчанию) - максимум 6 цифр. При необходимости используйте в научной записи.
1 - всегда 8 цифр. Всегда используйте в научной записи.
2 - всегда 16 цифр. Всегда используйте в научной записи.
Из MSDN: https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql?view=sql-server-2017
Это можно увидеть в следующем примере:
SELECT
[# Digits],
CONVERT(FLOAT(8), CONVERT(VARCHAR(20), N)) AS [FLOAT(VARCHAR(N))],
CONVERT(FLOAT(8), CONVERT(VARCHAR(20), N, 0)) AS [FLOAT(VARCHAR(N, 0))],
CONVERT(FLOAT(8), CONVERT(VARCHAR(20), N, 1)) AS [FLOAT(VARCHAR(N, 1))]
FROM (SELECT '6 digits', ABS('9972.95') UNION ALL SELECT '7 digits', ABS('29972.95')) T ([# Digits], N)
Возвращает следующие результаты:
# Digits FLOAT(VARCHAR(N)) FLOAT(VARCHAR(N, 0)) FLOAT(VARCHAR(N, 1))
-------- ----------------- -------------------- --------------------
6 digits 9972.95 9972.95 9972.95
7 digits 29973 29973 29972.95
Это доказывает, что UPDATE
эффективно использовал CONVERT(VARCHAR, ABS(...))
со стилем по умолчанию "0". Это ограничило FLOAT
от ABS
до 6 цифр. Убирая 1 символ, чтобы он не переполнял неявное преобразование, в этом сценарии сохраняются фактические значения.
Возвращаем это к OP:
- Функция
ABS
в этом случае возвращает FLOAT(8)
в примере.
- Затем
UPDATE
вызвал неявное преобразование, которое было эффективно `CONVERT (VARCHAR (2048), ABS (...), 0), которое затем переполнило максимальные цифры стиля по умолчанию.
- Чтобы обойти это поведение (если это связано с практической проблемой), вам нужно указать стиль 1 или 2 (или даже 3, чтобы получить 17 цифр), чтобы избежать этого усечения (но обязательно обращайтесь к научным обозначение используется, поскольку теперь оно всегда возвращается в этом случае)