Преобразование типа данных varchar в десятичные числа в SQL Server с ошибками хранимых процедур - PullRequest
0 голосов
/ 04 октября 2018
Столбец

A Quantity не может быть изменен, он должен быть decimal(18,5), и более старый пакет служб SSIS фактически использовал бы код VB, чтобы сделать это

 Dim q As Decimal
 q = Convert.ToDecimal(currentRow(16))

Однако я оптимизирую процесс дляимпортировать плоский файл в новую промежуточную таблицу

Значение, которое вставляется в промежуточную таблицу базы данных, вставляется как varchar(40).

Пример одного из значений:

0000000191185.18200-    

Я хочу преобразовать это на лету в запросе SQL Server к значению decimal(18,5), чтобы вставить его в другую финальную таблицу.

Точно ли говорить, что преобразование из varchar * decimal(18,5) должно выдать значение -191185.18200?

Я пытаюсь проверить приведение этого, и я получаю ошибку в T-SQL

select CAST(Quantity AS DECIMAL(18, 5)) 
from [DST].[DstPositionsStagingT]

Ошибка

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

Quantity - это столбец в таблице, содержащий значение.Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Пример встраивания простой очистки в тело SQL в надежде, что его легче читать.

SELECT
  T.SecurityNumber,
  SUM(clean.quantity)                                AS total_quantity,
  SUM(CASE WHEN clean.quantity IS NULL THEN 1 END)   AS failed_conversions,
  MAX(T.Cusip)                                       AS CUSIP
FROM
  [DST].[DstPositionsStagingT]   AS T
CROSS APPLY
(
  SELECT CASE WHEN T.Quantity LIKE '%-'
              THEN - TRY_CONVERT(DECIMAL(18,5), LEFT(T.Quantity, LEN(T.Quantity) - 1))
              ELSE   TRY_CONVERT(DECIMAL(18,5),      T.Quantity                      )
         END
)
  AS clean(quantity)
GROUP BY
   T.SecurityNumber
0 голосов
/ 04 октября 2018

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

, для этого можно использовать case when, проверить и преобразовать соответственно

declare @value  varchar(20)

select  @value  = '0000000191185.18200-'

select  case    when    right(@value, 1) = '-'
        then    -convert(decimal(18,2), replace(@value, '-', ''))
        else    convert(decimal(18,2), @value)
        end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...