在SSIS中移动尾部短划线(-)的最佳方式



我有一个SSIS包,它按计划运行,并从平面文件中获取值。这些平面文件偶尔会包含负值,但是负值符号会在值的末尾出现,例如0.01020654-。当SSIS包运行并试图将这些负值导入表时,我会得到以下错误:

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

列上的数据类型为十进制(18,10(

这些值可能并不总是相同的长度,例如,每次可能有不同数量的小数位数。我想我只需要把"-"移到值的前面。

我已经看到了使用SQL命令来解决这个问题的各种解决方案,例如convert,我应该添加一个额外的执行SQL任务来运行这个转换,或者添加一个派生列吗?我只是不确定最好的方法,我很想看看这方面的潜在解决方案。这个程序包99%的时间都运行良好,只有当这些底片出现时,我才会遇到问题。

提前谢谢。

您可以使用具有以下表达式的派生列转换:

RIGHT([Column],1) == "-" ? "-" + SUBSTRING([Column],1,LEN([Column]) -1) : [Column]

如果需要检查空值,可以使用以下表达式:

REPLACENULL([Column],"") == "" ? NULL(DT_WSTR,50) : RIGHT([Column],1) == "-" ? "-" + SUBSTRING([Column],1,LEN([Column]) -1) : [Column]

将值转换为十进制(18,10(,可以使用以下表达式:

REPLACENULL([Column],"") == "" ? NULL(DT_DECIMAL,10) : RIGHT([Column],1) == "-" ? (DT_DECIMAL,10)("-" + SUBSTRING([Column],1,LEN([Column]) -1)) : (DT_DECIMAL,10)[Column]

我不建议使用额外的SQL任务。相反,您可以尝试在SQL查询本身中处理它(因此,如果还没有这样做,您应该将数据流的源从表本身更改为查询(:

DECLARE @t TABLE(
myVal NVARCHAR(100)
)
INSERT INTO @t VALUES
('100'),('-100'),('100-'),('100.00'),('-100.00'),('100.00-')
SELECT myVal, CAST(REPLACE(CASE WHEN RIGHT(myVal,1) = '-' THEN '-'+SUBSTRING(myVal,1,LEN(myVal)-1) ELSE myval END, ' ', '') AS DECIMAL(19,4)) AS myValDec
FROM @t

在Derive列中使用

  1. (DT_NUMERIC,18,10(REPLACE(列,"-","(
  2. 将Derive列设置为";添加为新列">
  3. 在"派生列名"中输入新列名[1] :https://i.stack.imgur.com/YesCq.png

最新更新