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
是表中包含该值的列。我在做什么错了?
答案 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