2017-01-25 18 views
0

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

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

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 

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

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

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

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

+0

SQLBindCol и т.д.? – jarlh

+0

@jarlh Не уверен, что это может помочь. Я напрямую не использую API ODBC. Просто выполнив запросы, как описано (см. Обновление) –

+0

Я нашел это: https://support.microsoft.com/en-us/help/3051993/fix-the-value-of-number-type-is-truncated-when -you-select-data-from-anacle-linked-server-by-using-ole-db-provider, но после установки SQL 2014 SP2 ничего не было изменено –

ответ

1

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

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

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

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

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

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

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

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

Успехов -

Марко здравомыслящий

+0

Я проверил свой запрос непосредственно с базой данных DB2 (без привязки сервер, а не в студии управления MS SQL). Он возвращает правильный результат. Так что я думаю, что это проблема связана с Microsoft OLE DB Provider для ODBC и LInked-сервера на SQL-сервере 2014 года. –

+0

Использовал ли клиент DB2 для его проверки напрямую, например, в командной строке DB2? Это было бы правильно. Или вы попробовали клиента ODBC через один и тот же драйвер ODBC? Это может сузить происхождение проблемы. – marcothesane

+0

Я пробовал другой клиент через один и тот же драйвер odbc. Так что это связано с Microsoft SQL Server –

 Смежные вопросы

  • Нет связанных вопросов^_^