всякий раз, когда мне нужно довольно длинное «строковое» поле в CDS, я вместо этого стремлюсь создать мемо-поле. Помимо вышеупомянутой проблемы с отображением (которая может быть решена довольно безболезненно), есть несколько других ограничений, поэтому у меня есть собственный потомок компакт-дисков. формат внутренней строки hyperbase (не vglib) одинаков, поэтому он ничего не изменит в этом отношении. Между прочим, есть dac (например, firedac), позволяющие настраивать и выбирать отображение типа целевого поля. не уверен, что компоненты ado могут быть исправлены / улучшены для достижения аналогичной функциональности. более того, в наборе данных iirc firedac есть возможность управления внутренней структурой полей строки (встроенный буфер в строке или просто указатель на динамически размещаемый буфер), но он не заменяет компакт-диски 1: 1.
Здесь левый столбец сравнения десятичное значение, правый столбец расчетное денежное значение:
DECLARE @money AS money
SET @money = 2871047428.20
SELECT CAST(@money AS decimal(34,4)) / 10000000, @money / 10000000
См. также здесь на Переполнении стека:
ответ splattne почти корректен, за исключением двух незначительных изменений:
DECLARE @money AS money
SET @money = 2871047428.20
SELECT CAST(@money AS decimal(34,6)) / 10000000.0, @money / 10000000.0
Это даст корректный ответ: 287.10474282. То, что я сделал, изменяет значение точности и добавляет ".0" к значению подразделения.
Единственной вещью, которая озадачивает меня прямо сейчас, является факт, я должен снять значение в качестве десятичного числа (34,6) вместо ожидаемого десятичного числа (34,8).
Так, я записал запрос в другом отношении, который имеет больше смысла мне:
DECLARE @money AS money
SET @money = 2871047428.20
SELECT CAST((@money / 10000000.0) AS decimal(34,8)), @money / 10000000.0
Посмотрите, какой работает на Вас.
Вы все совершаете нападки, причуды десятичного подразделения Вот мой ответ на другой поток, Точность Подразделения Десятичного числа T-SQL
И у Вас могут быть неявные преобразования плавающие также из-за приоритета типов данных, если Вы используете 10000000.0
DECLARE @money AS money
SET @money = 2871047428.20
--Oddities
SELECT
CAST(@money AS decimal(34,8)) / 10000000,
CAST(@money AS decimal(34,8)) / 10000000.0,
CAST(@money AS decimal(34,8)) / 10000000.00,
CAST(@money AS decimal(34,8)) / 10000000.000,
CAST(@money AS decimal(34,8)) / 10000000.0000
--Should be safe. My brain hurts if I work through p and s
SELECT
CAST(@money AS decimal(38,8)) / CAST(10000000 AS decimal(8,0))
SELECT CAST(currency_rate AS decimal) / 10000000 FROM ...