2015-03-19 4 views
1

У меня есть большое количество карточных жетонов (16 цифр), загруженных из xml-файла в sql-сервер. Проблема заключается в том, что я рассматриваю их как выражение, образец ниже:Преобразование экспоненциального числа в sql

3.3733E+15 
3.3737E+15 
3.3737E+15 
3.3737E+15 
3.37391E+15 
3.37391E+15 
3.37398E+15 
3.37453E+15 
3.37468E+15 
3.37468E+15 
3.3747E+15 
3.37486E+15 
3.37486E+15 
3.37567E+15 
3.3759E+15 
3.3759E+15 

Любое предложение об изменении их на 16-значное число? Я попытался изменить тип данных, но получил ошибку "Conversion failed when converting the varchar value '3.37201E+15' to data type int"

Спасибо за помощь!

Edit:

@ X.L.Ant видеть мой код ниже. Я создаю эту таблицу из другой, которая просто вставляется в xml-файл. Может ли это вызвать ошибку, потому что некоторые строки пустые в столбце TOKEN?

CREATE TABLE MULTICURRENCY_CHECK 
    (
    TOKEN varchar(255) 
    ) 
    /*Merges all card tokens into 1 column, as in xml they are spread across different columns*/         
    INSERT INTO MULTICURRENCY_CHECK 
    (
    TOKEN 
    ) 
    SELECT no FROM gpstransactionsnew2 
     UNION ALL 
    SELECT no19 FROM gpstransactionsnew2 
     UNION ALL 
    SELECT no68 FROM gpstransactionsnew2 
     UNION ALL 
    SELECT no93 FROM gpstransactionsnew2 
     UNION ALL 
    SELECT no107 FROM gpstransactionsnew2 
     UNION ALL 
    SELECT no121 FROM gpstransactionsnew2 

    SELECT REPLACE(TOKEN, 'OW1', ' ') 
    FROM MULTICURRENCY_CHECK 

    /*Converts exponential expression to number*/ 
    SELECT CONVERT(numeric(16,0), CAST(TOKEN AS FLOAT)) 
    FROM MULTICURRENCY_CHECK 

ответ

7

Попытка бросить ваша строка плавать до его преобразования:

SELECT CONVERT(numeric(16,0), CAST(TOKEN AS FLOAT)) 
FROM MULTICURRENCY_CHECK 

Я не знаю, каков формат этих чисел в вашем источнике XML, но с предоставленными вами данными вы, в конце концов, получите 33733, а затем кучу нулей. Если у вас есть большая точность в вашем XML, возможно, вам следует настроить параметры импорта, чтобы сохранить эту точность вместо того, чтобы пытаться справиться с этим в БД.

EDIT:

Протестируйте ваши строки с ISNUMERIC, чтобы избежать ошибок литейные вы получаете. Добавление исходного вывода вашего столбца позволит вам проверить, какое значение не удалось преобразовать (т. Е. Преобразует в 0).

SELECT TOKEN, 
     CONVERT(NUMERIC(16, 0), CAST(CASE 
             WHEN ISNUMERIC(TOKEN) = 1 THEN 
             TOKEN 
             ELSE 0 
            END AS FLOAT)) 
FROM MULTICURRENCY_CHECK 
+0

Я знаю это, но он преобразует только 1 номер вправо? Я хочу преобразовать все (более 20 тыс. Строк) – Lukas

+0

@Lukas, что вы подразумеваете под 'it будет конвертировать только 1 номер' ... он думает, что это должно работать –

+0

Ошибка: Ошибка 8114: Ошибка преобразования типа данных varchar в float. – Lukas

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