从可变长度组件的列创建派生列
Creating derived columns from column of variable length components
我希望得到你的指导。我有一列,由可变长度的部分组成,需要拆分成单独的附加列。 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 表达式。任何建议将不胜感激。提前致谢!
为了简化表达式逻辑,我暂时忽略了数据转换。如果你需要它们,你应该能够在必要的地方添加它们。
由于您的数据中有一个一致的 CON
值,您可以像对 SchemaId
所做的那样将其用作锚点并从那里开始工作。我认为您缺少的部分是您不必将字符串中剩余的确切字符数提供给 SUBSTRING
表达式。如果你只是想走到最后,把 99999
放在那里然后完成它:
SUBSTRING(PCMRetrievalCode
,FINDSTRING(PCMRetrievalCode
,"CON"
,1
) + 3
,99999
)
我用 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)
基本原理和假设概念:
- PO 或 PA 总是 2 个字符
- CON 始终存在于目标
- ID 是数字(搜索 "C" 和 "N" 是安全的)
感谢大家的建议!
我能够通过对派生列使用以下表达式来使其工作:
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)))
我希望得到你的指导。我有一列,由可变长度的部分组成,需要拆分成单独的附加列。 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 表达式。任何建议将不胜感激。提前致谢!
为了简化表达式逻辑,我暂时忽略了数据转换。如果你需要它们,你应该能够在必要的地方添加它们。
由于您的数据中有一个一致的 CON
值,您可以像对 SchemaId
所做的那样将其用作锚点并从那里开始工作。我认为您缺少的部分是您不必将字符串中剩余的确切字符数提供给 SUBSTRING
表达式。如果你只是想走到最后,把 99999
放在那里然后完成它:
SUBSTRING(PCMRetrievalCode
,FINDSTRING(PCMRetrievalCode
,"CON"
,1
) + 3
,99999
)
我用 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)
基本原理和假设概念:
- PO 或 PA 总是 2 个字符
- CON 始终存在于目标
- ID 是数字(搜索 "C" 和 "N" 是安全的)
感谢大家的建议!
我能够通过对派生列使用以下表达式来使其工作:
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)))