基于可变长度组件列创建派生列的SSIS实现咨询
嘿,我来帮你搞定这个SSIS派生列的拆分问题!针对你提到的PCMRetrievalCode格式(比如PO607CON1324),咱们可以用SSIS的字符串函数精准拆分每个段,下面是具体的实现步骤和表达式:
SSIS派生列拆分PCMRetrievalCode方案
先明确你的编码规则,方便对应拆分逻辑:
- 前2位:包裹类型码(PO=非包裹/PA=包裹)
- 可变长度数字段:SchemaId(版本升级后可超过3位)
- 固定3位字母:容器标识(比如CON)
- 末尾3-5位数字:ContainerId
1. 包裹类型码(ParcelType)
直接取字符串前2位即可,表达式非常简单:
LEFT(PCMRetrievalCode, 2)
不管后面的字段长度怎么变,前两位固定是类型码,这个逻辑不会出错。
2. SchemaId
这里的核心是找到类型码之后、容器标识之前的数字段。因为容器标识是固定3位字母(比如CON),我们可以先定位到容器标识的起始位置,再计算SchemaId的长度:
SUBSTRING(PCMRetrievalCode, 3, FINDSTRING(PCMRetrievalCode, "CON", 1) - 3)
逻辑解释:
FINDSTRING(PCMRetrievalCode, "CON", 1):找到容器标识"CON"第一次出现的位置- 减去3是因为SUBSTRING的起始位置是3(跳过前2位类型码),所以从第3位开始,截取到"CON"之前的所有字符,就是SchemaId
如果你的容器标识不止CON一种(比如还有BOX、CRT等),可以改用PATINDEX来定位第一个字母段的起始位置,适配所有3位字母标识:
SUBSTRING(PCMRetrievalCode, 3, PATINDEX("%[A-Z]%", SUBSTRING(PCMRetrievalCode, 3, LEN(PCMRetrievalCode))) - 1)
这个表达式会从第3位开始找第一个大写字母的位置,减去1就是SchemaId的长度,不管容器标识是什么都能生效。
3. 容器标识(ContainerCode)
它是固定3位,我们可以基于前面找到的位置直接截取:
针对固定CON标识的表达式:
SUBSTRING(PCMRetrievalCode, FINDSTRING(PCMRetrievalCode, "CON", 1), 3)
适配多标识的表达式(用PATINDEX):
SUBSTRING(PCMRetrievalCode, PATINDEX("%[A-Z]%", SUBSTRING(PCMRetrievalCode, 3, LEN(PCMRetrievalCode))) + 2, 3)
逻辑解释:
PATINDEX返回的是从第3位开始的字母位置,加上前面的2位类型码,就是容器标识的起始位置,再截取3位即可。
4. ContainerId
这是最后一段,从容器标识结束的位置截取到字符串末尾:
针对固定CON标识的表达式:
RIGHT(PCMRetrievalCode, LEN(PCMRetrievalCode) - (FINDSTRING(PCMRetrievalCode, "CON", 1) + 2))
适配多标识的表达式(用PATINDEX):
RIGHT(PCMRetrievalCode, LEN(PCMRetrievalCode) - (PATINDEX("%[A-Z]%", SUBSTRING(PCMRetrievalCode, 3, LEN(PCMRetrievalCode))) + 4))
逻辑解释:
FINDSTRING(...) + 2:CON是3位,起始位置加2就是容器标识的最后一位位置- 总长度减去这个位置值,就是ContainerId的长度,用
RIGHT截取末尾对应长度的字符即可
注意事项
- 请确保所有PCMRetrievalCode都严格符合这个格式,否则可能出现拆分错误。如果有异常值,可以在派生列里加条件判断(比如用
ISNULL或LEN检查),返回NULL或默认值,避免包运行失败。 - 测试时一定要用不同场景的示例,比如SchemaId是4位的(如PO1234BOX5678)、ContainerId是5位的(如PA98CRT12345),验证拆分结果是否正确。
内容的提问来源于stack exchange,提问作者daniness
相关产品推荐
相关产品推荐

