从可变长度组件列创建派生列

时间:2018-04-24 14:49:51

标签: ssis derived-column

我希望得到你的指导。我有一个列,由可变长度的部分组成,需要拆分成单独的附加列。列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包中,我尝试将这些列创建为派生列,但基于其SchemaID和ContainerID的可变长度组件,我在分割PCMRetrievalCode列时遇到问题。我尝试过使用FINDSTRING函数,因为没有CHARINDEX并尝试使用DT_WSTR,因为这是SQL Server nvarch数据类型的SSIS兼容数据类型。这些是我在转型编辑器中尝试的表达式:

enter image description here

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

3 个答案:

答案 0 :(得分:2)

我用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")

答案 1 :(得分:1)

我暂时忽略了数据转换以简化表达式逻辑。如果您需要它们,您应该能够在必要时添加它们。

由于您的数据中包含一致的CON值,因此您可以将其用作SchemaId的锚点并从那里开始工作。我认为您缺少的部分是您不必将字符串中剩余的确切字符数量提供给SUBSTRING表达式。如果您只是想要结束,请将99999放在那里并完成它:

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

答案 2 :(得分:0)

感谢您的建议,全部!

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

inline-flex