导入带有虚拟小数的固定宽度文件

时间:2019-08-23 11:20:26

标签: sql-server ssis etl sql-server-2017 ssis-2017

我有一个固定宽度的主数据文件。该文件包含许多带有费用但不带小数点的列。此数据需要导入到SQL Server。

借助说明文档,我知道了这些列的精度和小数位数。

在下面的SSIS 2017中,我尝试了以下方法,但又尝试了一种方法,但没有其他方法的组合,但没有成功:

  1. 在“平面文件连接管理器”中设置精度和小数位数。
  2. 使用数据转换转换DT_Numeric指定精度和范围

我在错误路径上设置了重定向,所有行都在使用该路径。

2 个答案:

答案 0 :(得分:2)

在处理隐含的小数位时,实际上有两种方法:如Hadi所示,字符串操作是将小数字符放入字符串中以获得显式值。

第二种方法是将其数学化。

这两种方法都将导致您必须在平面文件连接管理器中定义与目标类型不同的列。将数据注入管道后,您将需要对其进行修改以满足目标类型。

如果您使用Hadi的解决方案,则省去了多次强制转换(更改数据类型)的麻烦,只需将值作为字符串导入即可。您可以使用派生列转换来执行字符串操作,以将字符串在隐式小数位的位置分开。逻辑近似

SUBSTRING(MyColumn, 1, IntegerDigits) + "." + RIGHT(MyColumn, ScaleDigits)

其中 IntegerDigits ScaleDigits 是小数点前后的位数。

在派生列转换中,我会将该列称为MyColumnWithDecimalPlace

然后,在上述派生列转换之后,我将添加第二个派生列转换(或数据转换转换)。在此步骤中,我们将把此字符串值转换为数字值。为什么要走两步?如果数据有些奇怪,我可以在这两个点之间放一个数据视图(或数据抽头),然后眼球出问题了。如果我尝试一次完成所有操作,那么我看不到是在失败的字符串中添加小数位还是刚构建的字符串值被破坏并且无法转换为数字。

另一种方法是将源列定义为整数,然后使用派生列转换对其进行数学运算。看起来像

MyColumn / POWER(10, ScaleDigits)
再次

其中ScaleDigits是我们期望的小数位数。我倾向于这种方法,因为它比较简单-一个操作完成。

答案 1 :(得分:1)

如果该值不包含小数点,则无法在使用派生列添加小数点之前将它们转换为小数。尝试以下解决方案:

假设我们具有以下整数值

  

12301452

我们需要将其转换为十进制,如下所示:

  

1230.1452

然后,我们应该在派生列中使用类似的表达式:

func setupUserInteraction(){
    self.view.isUserInteractionEnabled = true
    self.view.addGestureRecognizer(UISwipeGestureRecognizer(target: self, action: #selector(handelSwipe)))
}

@objc func handelSwipe(g: UISwipeGestureRecognizer){
    if g.direction == .right {
        print("Swipe Right")
    }

    if g.direction == .left {
        print("Swipe Left")
    }
}

(DT_DECIMAL, 4)( SUBSTRING((DT_WSTR,50) @[User::Variable],1,LEN( (DT_WSTR,50)@[User::Variable] ) - 4) + "." + RIGHT((DT_WSTR,50)@[User::Variable],4)) 是比例值。