6

そのため、現在、SSIS2008を使用して古いAdvantageデータベースサーバーからSQL2005への移行に取り組んでいます。古いAdvantageデータベースの列の1つはMEMOタイプです。デフォルトでは、これはDT_TEXT列に変換されます。新しいデータベースでは、この大きなフィールドは必要ありませんが、VARCHAR(50)などに制限できます。次の式でこれを変換するために、派生列変換を正常に設定しました。

(DT_STR,50,1252)[ColumnName]

次に、さらに一歩進んで、すべてのNULL値を空の文字列に置き換えます。これは式を使用すると簡単に思えISNULL([ColumnName])?"":(DT_STR,50,1252)[ColumnName]ますが、問題はOLEDB変換先に次のエラーが含まれていることです。

Unicode文字列と非Unicode文字列の間で変換できません...

したがって、明らかにISNULL式全体がデータ型をUnicode文字列[DT-WSTR]に変換します。式全体またはさまざまな部分にさまざまなキャストを試しましたが、必要なデータ型に一致するデータ型を取得できません。

まず、DT_TEXTタイプを直接ユニコードに変換することは可能ですか?私の知る限り、キャストはそのようには機能しません。そうでない場合、NULL値が空の文字列に変換されるように式を機能させる方法はありますか?

助けてくれてありがとう!

4

2 に答える 2

2

派生列でこれを試してみてください。

(DT_STR,50,1252) (ISNULL(ColumnName) ? "" : (DT_STR,50,1252) ColumnName)

これには、目的の処理シーケンスを保証するために、括弧内に条件付き(?:)が付いた追加の型キャストが含まれています。""のデフォルトはDT_WSTRであるため、元の式は暗黙的にDT_WSTRにキャストされていたと思います。この新しいバージョンでは、式が評価された後、キャストをDT_STRに強制します。

于 2011-01-14T18:23:10.000 に答える
0

私はうまくいく何かを見つけました。それは最善の解決策ではないかもしれませんが、私の状況ではうまくいくでしょう。

OLE DBソースから、最初に派生列を作成しました。これはISNULLを使用したため、最終的にDT_WSTRユニコードタイプに変換されました。必要なタイプに戻すためのキャストを取得できませんでしたが、派生列とOLEDB変換先の間にデータ変換変換を追加しました。これにより、入力文字列が取得され、DT_STRに変換されます。これはすべて、何度も変換するのが少し面倒だと感じますが、列には私が心配しなければならないファンキーな情報が含まれていないので、うまくいくと思います。

解決策を熟考してくれたすべての人に感謝します。それに取り組むための素晴らしい方法を見つけたら、私はもっと興味があります。

于 2011-01-14T17:38:25.790 に答える