Как преобразовать первичный ключ Oracle NUMBER в SQL Server для потребления Ado.Net - PullRequest
0 голосов
/ 01 февраля 2011

Это может быть сложный вопрос, так как я не совсем понимаю проблему.

Я собираю данные из интерфейса Oracle Apex Query и сохраняю результаты в локальном экземпляре SQL Server, чтобы локальные приложения могли использовать данные.

База данных Oracle, из которой я извлекаю информацию, использует первичные ключи, которые определены как типы данных NUMBER (без определения точности или масштаба). Какой тип данных я должен использовать на стороне SQL Server для хранения поля Oracle NUMBER?

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

Я играл с использованием DECIMAL (38,38) в Sql Server для хранения значения Oracle, но при попытке установить ADO.NET SqlParameter (например, в SqlCommand) с типом DECIMAL (38,38) ) со значением вы получите ошибку арифметического переполнения, поскольку она всегда будет полностью расширять масштаб. НАПРИМЕР. число 23425 будет расширено до 23425.00000000000000000000000000000000000000 и приведет к ошибке переполнения, так как использует больше памяти, чем доступно для точности типа данных SqlParameter.

Ответы [ 2 ]

1 голос
/ 01 февраля 2011

В Oracle, если не указана точность или масштаб, NUMBER - это десятичный тип с плавающей запятой. Не следует путать с двоичным типом с плавающей запятой.

Oracle также поддерживает десятичную фиксированную точку, задавая точность и дополнительно масштабируя ее до NUMBER, т. Е. NUMBER(11,2), что будет полезно для хранения значений в долларах США до 999 999 999,99 $.

SQL Server поддерживает десятичную систему с фиксированной запятой с типом DECIMAL и двоичные числа с плавающей запятой с с плавающей и действительной Ни один из типов данных с десятичной запятой или плавающей запятой SQL Server не будет содержать все возможные значения десятичного типа с плавающей запятой в Oracle (NUMBER) без ошибок или потери информации.

Если вы имеете дело с базой данных Oracle, все числовые данные хранятся в формате NUMBER без точности или масштаба, а некоторые данные имеют целочисленные значения, такие как суррогатные первичные ключи и некоторые данные это значения с фиксированной запятой, такие как доллары США и другие данные действительно широко варьируются по масштабу и требуют только приблизительных значений, тогда вам нужно будет сопоставлять типы данных по столбцам.

1 голос
/ 01 февраля 2011

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

Звучит так, будто реальный вопрос - это int илиплавать?Поскольку самым простым решением было бы преобразовать его в целое число.

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

Я не использую Oracle, но я верю, что правильный вариант SQL будет следующим:

select id_column
  from theTable
 where id_column - trunc(id_column,0) <> 0
   and rownum <= 1

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

Если по какой-то странной причине они являются числами с плавающей запятой, вы все равно можете конвертировать их в целые числа.Выполните запрос, чтобы определить наивысшую точность, а затем умножьте на 10 ^ x, где x - максимальная точность.Это снова дает вам целые числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...