【问题标题】:Removing leading zeros in SSIS删除 SSIS 中的前导零
【发布时间】:2012-03-08 08:46:31
【问题描述】:

在将数据导入 SQL Server 2008 数据库之前,我使用 SSIS 处理来自旧系统的数据。 货币字段的格式如下:

000000xxx.xx

我需要删除前导零。请注意,实际货币价值没有固定的位数。因此,例如,它可能是 xxxxx.xx 或 x.xx 或 xxxxxxxxxxx.xx

我找到了这个answer,但派生列工具仅显示有限的字符串函数,例如 Access 公式向导。

所以我的问题:

  • 如何在 DTS 派生列工具中使用 PATINDEX
  • 否则,如何从输入列中删除前导零

【问题讨论】:

    标签: ssis sql-server-2008-r2 trim dts leading-zero


    【解决方案1】:

    你是如何查询数据的?我想您在 OleDBSource 组件上使用直接表访问,对吧?我不建议这样做,因为桌子上的微小变化可能会破坏您的包裹。

    我会选择一个包含源表中选择的视图,在这个选择上我会使用 PATINDEX 函数,在包内,我会选择视图而不是表。

    这是一个很好的方法,因为如果你需要做一些小的改动,你可以改变视图而不是包

    如果你不想写视图,可以,不要选择“数据访问模式”=“表或视图”,选择“sql命令”,直接在包上写你的sql。

    【讨论】:

    • 我可能会误解或曲解您的回复。我认为视图不能解决这个问题,因为视图的更改也会破坏数据流任务中的 OLE DB 源。
    • 但没有任何损坏!他只有格式错误的数据。希望我建议在数据到达 SSIS 之前对其进行更正,这意味着使用视图获取数据并在其中使用任何必要的方法将数据设置为必要的格式
    【解决方案2】:

    您不能将数据转换为源系统中的数字等效类型吗?这应该是删除前导零的快速方法。 SELECT CAST(myCurrency AS decimal(18,2)) AS leadingZerosDropped FROM myTable

    否则,最简单的 SSIS 方法是使用数据转换任务并将其转换为数字类型(DT_CY/Currency 或 DT_Numeric/Numeric 工作得很好)

    来源查询

    SELECT '000000111.11' AS stringCurrency
    UNION ALL SELECT '0.22'
    UNION ALL SELECT '03.33'
    UNION ALL SELECT '004.44'
    UNION ALL SELECT '0005.55'
    UNION ALL SELECT '00000000000000000006.66'
    

    数据转换转换

    我创建了一个新列,currencyCurrency,它是 stringCurrency,应用了货币 [DT_CY] 的数据类型。

    结果

    stringCurrency            currencyCurrency
    000000111.11              111.11
    0.22                      0.22
    03.33                     3.33
    004.44                    4.44
    0005.55                   5.55
    00000000000000000006.66   6.66
    

    我完全支持不使用表访问模式,总的来说,我赞成将工作推送到源系统上,但如果源系统不允许转换或者您必须求助于玩弄字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-13
      • 2021-08-10
      • 2015-11-22
      • 2018-06-16
      • 1970-01-01
      • 2016-01-15
      • 2018-10-14
      相关资源
      最近更新 更多