#sql-server
#sql-сервер
Вопрос:
Я испытываю то, что я бы описал как совершенно неожиданное поведение, когда я передаю float
значение через LTRIM
или RTRIM
:
CREATE TABLE MyTable
(MyCol float null)
INSERT MyTable
values (11.7333335876465)
SELECT MyCol,
RTRIM(LTRIM(MyCol)) lr,
LTRIM(MyCol) l,
RTRIM(MyCol) r
FROM MyTable
Что дает следующие результаты:
MyCol | lr | l | r
--------------------------------------------
11.7333335876465 | 11.7333 | 11.7333 | 11.7333
Я наблюдал такое же поведение на SQL Server 2014 и 2016.
Теперь я понимаю, что LTRIM
и RTRIM
следует просто удалить пробелы из значения, а не приводить его / усекать.
У кого-нибудь есть идея, что здесь происходит?
Просто чтобы объяснить предысторию этого. Я генерирую SQL-запросы, используя свойства набора C # POCOS (результаты будут использоваться для генерации хэша MD5, который затем будет сравниваться с эквивалентным значением из таблицы Oracle) и для удобства оборачивал каждый столбец с помощью LTRIM / RTRIM.
Комментарии:
1. Похоже, что оно приведено к строке, чтобы соответствовать требованиям функции. В этом нет ничего странного
2. почему вы все равно пытаетесь обрезать пробелы от
float
типа данных? Их никогда не будет. Это может применяться только к строковым представлениям.3. Таким образом, вы получаете неожиданное поведение при использовании строковой функции со значением с плавающей запятой. Тогда не делайте этого.
4. @MartinSmith — Я добавил объяснение выше.
Ответ №1:
Возможно, вы можете использовать format() вместо этого
Declare @F float = 11.7333335876465
Select format(@F,'#.##############')
ВОЗВРАТ
11.7333335876465