SQL Server Integration Services 2012 の Expression Editor にある TOKEN() という新しい文字列関数で問題が発生しました。
これは、区切られたレコードを解析するのに役立つはずです。レコードがフラット ファイルから出力される場合は、フラット ファイル ソースを使用してこれを行うことができます。この場合、データベースの VARCHAR フィールドに文字列として保存された古い区切りインポート レコードを扱っています。ここで、それらを抽出し、マッサージして、区切り文字列として再エクスポートする必要があります。例えば:
1^リンゴ^0001^01/01/2010^アリクイ^A1
2^バナナ^0002^03/15/2010^クマ^B2
3^クランベリー^0003^4/15/2010^カラス^C3
これらの文字列が OldImportRecord という列にあり、区切り文字がキャレット (示されているように) であり、5 番目のフィールドを派生列に入れたい場合は、次のような式を使用します。
TOKEN(OldImportRecord,"^",5)
これは Anteater、Bear、Crow などを返します。実際、このレコードのフィールドごとに派生列を作成し (インデックスは 1 ベースであることに注意してください)、必要に応じてそれらを変更し、エクスポート用に別の区切りレコードを作成できます。 .
これが問題です。一部のデータに空の文字列 (または空の文字列としてレンダリングされた Null) が含まれている場合はどうなるでしょうか?
4^^0004^6/15/2010^ダック^D4
TOKEN() は、隣接する列区切り文字を数えることができず、列数がずれます。現在は、6 列ではなく 5 列しか表示されません。TOKEN(OldImportRecord,"^",5) は、意図した "Duck" ではなく "D4" を返します。4 番目の列を抽出すると、"Duck" を Date 列に入れようとすることになり、さまざまな楽しみが生じます。
部分的な回避策は次のとおりです。
TOKEN(REPLACE(OldImportRecord,"^^","^ ^"),"^",5)
これは 1 秒おきの区切り文字ペアを欠いていることに注意してください。そのため、REPLACE() の後の "5^ ^^ ^Emu^E5" のように見える "5^^^^Emu^E5" のような文字列では失敗します。列数はまだ間違っています。
だからここに私の完全な回避策があります。これには、ネストされた 2 つの REPLACE ステートメント ()、不要なスペースを削除するための RTRIM()、および結果を VARCHAR に保持したいための DT_STR キャストが含まれます。
(DT_STR,255,1252)RTRIM(TOKEN(REPLACE(REPLACE(OldImportRecord,"^^","^ ^"),"^^","^ ^"),"^",5))
他の人もこの問題に遭遇する可能性があるため、情報としてこれを投稿しています。
誰かがより良い回避策、または実際の解決策を持っていますか?