【问题标题】:Creating derived columns from column of variable length components从可变长度组件列创建派生列
【发布时间】:2018-04-24 14:49:51
【问题描述】:

我希望得到您的指导。我有一列,由可变长度部分组成,需要分成单独的附加列。 PCMRetrievalCode 列是 nvarchar 类型,由以下格式组成:

i.e. PO607CON1324

PO = Non-Package or PA = Package
607 = SchemaId --> could be more than 3 numbers, as the schema increases
CON = Container
1324 = ContainerId --> could be 3-5 numbers

因此,在我的 SSIS 包中,我尝试将这些创建为派生列,但在拆分 PCMRetrievalCode 列时遇到了问题,该表达式基于 SchemaID 和 ContainerID 的可变长度组件。我尝试使用 FINDSTRING 函数,因为没有 CHARINDEX 并且正在尝试使用 DT_WSTR,因为这是 SQL Server nvarch 数据类型的 SSIS 兼容数据类型。这些是我在转换编辑器中尝试的表达式:

我认为 PackageCode 和 SchemaID 的表达式希望没问题,但我遇到困难的是 ContainerID 表达式。任何建议将不胜感激。提前致谢!

【问题讨论】:

    标签: ssis derived-column


    【解决方案1】:

    我用 2 个独立的派生列对象做到了。

    第一个(GetPO 和剩余的以便于解析):

    POorPA = LEFT(data,2)
    leftover = SUBSTRING(data,3,9999)
    

    下一个派生列更复杂:

    ScemaID = LEFT(leftover,FINDSTRING(leftover,"C",1) - 1)
    CON = SUBSTRING(leftover,FINDSTRING(leftover,"C",1),3)
    ContainerID = RIGHT(leftover,FINDSTRING(REVERSE(leftover),"N",1) - 1)
    

    基本原理和假设概念:

    1. PO 或 PA 始终为 2 个字符
    2. CON 始终存在于目标中
    3. ID 是数字(搜索“C”和“N”是安全的)

    【讨论】:

    • 仅供参考,我使用 [data] 作为字段名称
    【解决方案2】:

    为了简化表达式逻辑,我暂时忽略了数据转换。如果你需要它们,你应该可以在必要的地方添加它们。


    由于您的数据中有一个一致的 CON 值,您可以将其用作锚点,就像您对 SchemaId 所做的那样,并从那里开始工作。我认为您缺少的部分是您不必将字符串中剩余的确切字符数量提供给 SUBSTRING 表达式。如果您只是想走到最后,请坚持99999 并完成它:

    SUBSTRING(PCMRetrievalCode
             ,FINDSTRING(PCMRetrievalCode
                        ,"CON"
                        ,1
                        ) + 3
             ,99999
             )
    

    【讨论】:

      【解决方案3】:

      谢谢大家的建议!

      我能够通过对派生列使用以下表达式来使其工作:

      PackageCode: SUBSTRING(((DT_WSTR,15)PCMRetrievalCode),1,2)
      
      SchemaID:  SUBSTRING((DT_WSTR,15)PCMRetrievalCode,3,FINDSTRING(((DT_WSTR,15)  
                 PCMRetrievalCode),"C",1) - 3)  
      
      ContainerID:  RIGHT(((DT_WSTR,15)PCMRetrievalCode),(LEN((DT_WSTR,15)
                    PCMRetrievalCode) - FINDSTRING((DT_WSTR,15)
                    PCMRetrievalCode,"N",1)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-14
        • 2011-12-20
        • 2019-12-07
        • 1970-01-01
        • 2019-02-13
        相关资源
        最近更新 更多