Попытка определить десятичные разряды с помощью CHARINDEX, получая: Ошибка преобразования типа данных varchar во float - PullRequest
0 голосов
/ 15 декабря 2018

Я постоянно использую этот фрагмент кода на многих объектах, когда пытаюсь определить количество десятичных знаков после «.».Целевая система, в которую я перемещаю данные, может обрабатывать только 2 dp. Поэтому мы находим данные с> 2 dp, умножаем их на 10, 100, 1000, а также умножаем значение поля «цена за» на тот же коэффициент.

SELECT 
    HQPROD, [HQPR1],
    Decimals = CASE Charindex('.', [HQPR1])
                  WHEN 0 THEN 0
                  ELSE LEN(CAST(CAST(REVERSE(CONVERT(VARCHAR(50), [HQPR1], 128)) AS FLOAT) AS BIGINT))
               END 
FROM 
    [SM_REP].[dbo].[BPCSF64_HQT]) EDP ON P.HQPROD = EDP.HQPROD

Тип столбца, с которым я работаю - DECIMAL(15,5).

Пример данных:

HQPROD         HQPR1
--------------------------
47001-RM64     175.89900
47001-T06OX      5.84500
47002-20T       80.44700
47002-T24       98.10300
47002-T32      144.07000
47003-01         1.54000
47003-02         1.54000
47003-03         0.51000

Сообщение об ошибке:

Ошибка преобразования типа данных varchar в число с плавающей точкой.

1 Ответ

0 голосов
/ 15 декабря 2018
SELECT 
HQPR1, 
Decimals = 

CASE WHEN HQPR1 > 0 THEN
       CASE Charindex('.', [HQPR1])
              WHEN 0 THEN 0
              ELSE LEN(CAST(CAST(REVERSE(CONVERT(VARCHAR(50), [HQPR1], 128)) AS FLOAT) AS BIGINT))
        END 
 ELSE 
     CASE Charindex('.', [HQPR1])
              WHEN 0 THEN 0
              ELSE LEN(CAST(CAST(REVERSE(     Stuff((CONVERT(VARCHAR(50), [HQPR1], 128)),1,1,'' )) AS FLOAT) AS BIGINT))
      END 
 END

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

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