【问题标题】:Converting varchar data type to decimals in SQL Server with stored procedure errors在 SQL Server 中使用存储过程错误将 varchar 数据类型转换为小数
【发布时间】:2018-10-04 00:09:06
【问题描述】:

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 是表中保存值的列。我做错了什么?

【问题讨论】:

  • 我不知道有任何标准将尾随 - 识别为“负面”。听起来你有一个数据质量问题,源于现有流程将数值存储为字符串的事实......任何解决方案都需要在处理数据之前更正数据(例如下面的答案去掉了尾随-(如果存在)。)
  • 这家投资3万亿美元的金融巨头用大型机很常见

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


【解决方案1】:

在 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

【讨论】:

  • 觉得你很漂亮不是吗?好吧,你是! :) thx 人
【解决方案2】:

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

【讨论】:

  • 我可以用其他选择值内联吗?例如,我有 10 个值,例如 SecurityNumber、MAX(Cusip) AS CUSIP、
  • 是的。为什么不。只需将@value 更改为您的列名,然后为您的每个列重复case 语句
  • 我收到演员表错误,我想知道一些奇怪的空格,因为我正在阅读一篇文章
  • 这几乎奏效了,但它轰炸了 Nulls CAST(LEFT(Quantity, CHARINDEX('.', Quantity) - 1) + '.' + SUBSTRING(Quantity,(CHARINDEX('.',Quantity)+1),3) AS DECIMAL(18,5)) CastedNumeric
猜你喜欢
  • 2016-06-22
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2014-10-04
  • 2020-06-17
相关资源
最近更新 更多