Числовые значения DB2 показаны без десятичных знаков, связанный сервер в MS SQL

У меня проблема с выполнением запросов к базе данных DB2. Числовые значения для некоторых столбцов возвращаются без десятичных знаков, например. У меня есть поле VPACKSP.VPTARA, которое содержит вес тары.

Выполнение такого запроса

SELECT VPACKSP.VPTARA FROM VPACKSP WHERE VPACKSP.VPTEIL = 123456 

возвращает значение 0,000, правильное значение должно быть 0,880

Выполнение запроса, в котором числовое значение умножается, возвращает правильное значение, но в несколько раз выше

SELECT VPACKSP.VPTARA * 100 FROM VPACKSP WHERE VPACKSP.VPTEIL = 123456 

возвращает значение

88,000

Запросы выполняются с использованием 64-разрядного драйвера ODBC ISeries Access Driver версии 13.00.01.0, установленного на Windows Server. Клиент, который я использую, — это Microsoft SQL Server, где связанный сервер был создан с использованием поставщика OLE DB для ODBC.

Фактический запрос выглядит следующим образом:

SELECT 
* 
FROM OPENQUERY(
  [LINKEDSERVERNAME]
,'SELECT VPACKSP.VPTARA FROM VPACKSP WHERE VPACKSP.VPTEIL = 123456'
)
;

Это происходит не для всех числовых столбцов. Я пытался привести к NUMERIC(32,16), а также к DECIMAL(10,5), а также другим комбинациям десятичных знаков, но все результаты - нули, работает только умножение. Что может быть не так?


person Sebastian Widz    schedule 25.01.2017    source источник
comment
SQLBindCol и т. д.?   -  person jarlh    schedule 25.01.2017
comment
@jarlh Не уверен, что это может помочь. Я не использую ODBC API напрямую. Просто выполняю запросы, как описано (см. обновление)   -  person Sebastian Widz    schedule 25.01.2017
comment
Я нашел это: support.microsoft.com/en-us/help/3051993/, но после установки SQL 2014 SP2 ничего не изменилось   -  person Sebastian Widz    schedule 25.01.2017


Ответы (1)


На ум приходят две вещи, Себастьян:

а) тип данных DECIMAL в DB2, который хранит значение как один полубайт на цифру, плюс шестнадцатеричный C для положительного и шестнадцатеричный D для отрицательного в крайнем правом полубайте (0,880, если это DECIMAL(4,3), хранится в трех байтах как Hex 00 88 0C), а положение десятичной точки сохраняется в метаданных СУБД. Таким образом, он может быть плохо переведен драйвером ODBC.

б) Также на уровне уровня ODBC: драйвер может задохнуться от того факта, что в Германии в качестве десятичного разделителя используется запятая, а не точка, и драйвер останавливается, как только находит символ, который не ожидается как часть числового литерала - ваша запятая.

Я бы проверил ваш запрос (только тот, который у вас есть между одинарными кавычками в вашем примере), используя обычный клиент ODBC SQL, например, инструмент тестирования Microsoft ODBC. Я ожидаю, что он вернет ту же ошибку, и поэтому у вас будет хотя бы ошибка, о которой нужно сообщить.

Обходным решением может быть настройка языковых параметров в Windows (возможно, временно) для использования точки вместо запятой в качестве десятичного разделителя (и запятой вместо немецкой точки, возможно, в качестве разделителя тысяч, чтобы вы не создавали путаница).

Два часа спустя - еще одна идея обходного пути: не могли бы вы попробовать:

SELECT 
  CAST(VPACKSP.VPTARA AS VARCHAR(16)) AS vptara
FROM VPACKSP 
WHERE VPACKSP.VPTEIL = 123456

? Таким образом, вы позволяете DB2 выполнять преобразование в строку и не оставляете его на внешний интерфейс - просто идея...

Удачи -

Марко Вменяемый

person marcothesane    schedule 25.01.2017
comment
Я проверил свой запрос непосредственно в базе данных DB2 (без связанного сервера, а не в студии управления MS SQL). Он возвращает правильный результат. Итак, я предполагаю, что эта проблема связана с поставщиком Microsoft OLE DB для ODBC и сервером LInked в SQL Server 2014. - person Sebastian Widz; 25.01.2017
comment
Использовали ли вы клиент DB2 для прямой проверки, например, командную строку DB2? Тот поступил бы правильно. Или вы пробовали использовать клиент ODBC через тот же драйвер ODBC? Это может сузить источник проблемы. - person marcothesane; 25.01.2017
comment
Я пробовал другого клиента через тот же драйвер odbc. Так что это что-то связанное с Microsoft SQL Server - person Sebastian Widz; 25.01.2017
comment
Я нашел эту статью kb, но она относится к оракулу, но симптомы похожи. Установил SP2, но в моем случае это не работает (возможно, DB2 нужно другое решение) (support.microsoft.com/en- нам/help/3051993/) - person Sebastian Widz; 25.01.2017