我在名为 TOKEN() 的表达式编辑器中遇到了 SQL Server Integration Services 2012 的新字符串函数的问题。
这应该可以帮助您解析分隔记录。如果记录来自平面文件,您可以使用平面文件源执行此操作。在这种情况下,我正在处理以字符串形式存储在数据库 VARCHAR 字段中的旧分隔导入记录。现在需要将它们提取、处理并重新导出为分隔字符串。例如:
1^苹果^0001^01/01/2010^食蚁兽^A1
2^香蕉^0002^03/15/2010^熊^B2
3^蔓越莓^0003^4/15/2010^乌鸦^C3
如果这些字符串在名为 OldImportRecord 的列中,分隔符是插入符号(如图所示),并且我们希望将第五个字段放入派生列中,我们将使用如下表达式:
TOKEN(OldImportRecord,"^",5)
这会返回 Aneater、Bear、Crow 等。其实我们可以为这条记录中的每个字段创建 Derived Columns(注意索引是从一开始的),根据需要更改它们,然后再构建另一个分隔记录用于导出.
这就是问题所在。如果我们的某些数据包含一些空字符串(或呈现为空字符串的 Null)怎么办?
4^^0004^6/15/2010^鸭^D4
TOKEN() 无法计算相邻的列分隔符,这会导致列数丢失。现在它只看到五列而不是六列。我们的 TOKEN(OldImportRecord,"^",5) 返回“D4”而不是预期的“Duck”。当我们提取第四列时,我们最终尝试将“Duck”放入 Date 列中,然后各种有趣的事情接踵而至。
这是部分解决方法:
TOKEN(REPLACE(OldImportRecord,"^^","^ ^"),"^",5)
请注意,这会错过每隔一个分隔符对,因此对于像“5^^^^Emu^E5”这样的字符串,它会失败,它在 REPLACE() 之后看起来像“5^ ^^ ^Emu^E5”。列数仍然错误。
所以这是我的完整解决方法。这包括两个嵌套的 REPLACE statements()、一个用于删除多余空格的 RTRIM() 和一个 DT_STR 强制转换,因为我想将结果保留在 VARCHAR 中:
(DT_STR,255,1252)RTRIM(TOKEN(REPLACE(REPLACE(OldImportRecord,"^^","^ ^"),"^^","^ ^"),"^",5))
我发布此信息以供参考,因为其他人也可能遇到此问题。
有没有人有更好的解决方法,甚至是真正的解决方案?