Проблема с типом данных SQL Server - PullRequest
1 голос
/ 10 февраля 2010

У нас есть база данных SQL Server 2000 со столбцами типа данных о деньгах, и у нас есть странная проблема с числами в столбцах типа денег, в которых мы храним числа с двумя десятичными знаками. В течение долгого времени все было в порядке. Но теперь я вижу, что в некоторых строках число 47,22 теперь равно 47,2178. Когда я выбираю CAST (COLUMN as CHAR), результат равен 47.22, но когда я получаю значение из набора записей ADO, я получаю результат 47.2178. Я просматриваю все приложения, если есть какое-либо место, где оно может написать число с 4 десятичными разрядами и ничего не найти (а в журнале истории приложения есть записи, что приложение записывает 47,22 в базу данных). Это может быть какая-то проблема с SQL Server?

редактировать: приложение написано на VB6

Ответы [ 2 ]

3 голосов
/ 10 февраля 2010

Вы на самом деле используете тип данных money или тип с плавающей запятой?

Что происходит, когда вы используете менеджер предприятия для выбора из этой таблицы? Все выглядит хорошо?

Я предполагаю, что вы конвертируете данные в тип с плавающей точкой где-то по пути. Вероятно, в коде ADO.

UPDATE

За MS : при переводе денег в строковый тип в игру вступает язык. Вот почему он округляется до 2 десятичных знаков.

У вас есть три варианта.

  1. Сначала приведите тип денег к эквивалентному десятичному знаку, затем приведите результат к символу
  2. Измените региональные настройки устройства по умолчанию на нужный формат.
  3. Не используйте для начала тип данных money, просто используйте десятичную.
1 голос
/ 10 февраля 2010

Не используйте Enterprise Manager, чтобы делать какие-либо выводы о том, что действительно хранится в ваших таблицах. У EM иногда есть свое мнение о том, как интерпретировать данные.

Глядя на ваш CAST (.... в CHAR) причина объясняется в документации (ищите CAST & CONVERT) ...

В следующей таблице приведены значения за стиль, который может быть использован для конвертировать деньги или деньги в символьные данные.

Значение вывода
0 (по умолчанию) без запятых каждые три цифры слева от десятичная точка и две цифры право десятичной точки; за Например, 4235,98.

1 запятая каждые три цифры слева от десятичная точка и две цифры право десятичной точки; за Например, 3510,92.

2 Запятых нет каждые три цифры слева от десятичная точка и четыре цифры до право десятичной точки; за например, 4235,9819.

РЕДАКТИРОВАТЬ: наконец выяснил, как использовать функцию BlockQuote. : -)

...