在SQL Server中将varchar数据类型转换为带存储过程错误的小数

时间:2018-10-04 00:09:06

标签: sql sql-server tsql sql-server-2008

Quantity列不能更改,它应该是decimal(18,5),并且较旧的SSIS包实际上将使用VB代码来完成此操作

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

但是,我正在简化将平面文件导入到新暂存表中的过程

将要插入数据库登台表的值插入为varchar(40)

其中一个值的示例:

0000000191185.18200-    

我想在SQL Server查询中即时将其转换为decimal(18,5)值,以便将其插入到另一个最终表中。

是否准确地说从varchardecimal(18,5)的转换应产生-191185.18200的值?

我正在尝试对此进行转换,并且在T-SQL中出现错误

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

错误是

  

将数据类型varchar转换为数字时出错。

Quantity是表中包含该值的列。我在做什么错了?

2 个答案:

答案 0 :(得分:3)

在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

答案 1 :(得分:1)

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