2

24.209991 などの値を持つソース フラット ファイルがありますが、SQL Server に money 型としてロードする必要があります。DTS (変換元) では、その値は 24.21. SSIS でそのフィールドを変換するにはどうすればよいですか?

現在、タイプを DT_STR から DT_CY に変更したところ、「データ変換に失敗しました。列 "Col003" のデータ変換で、ステータス値 2 とステータス テキスト "データが失われる可能性があるため、値を変換できませんでした。" が返されました。

データ変換タスクを使用しますか? そして、何?

また、ソース出力列を DT_NUMERIC に設定してから、それを DT_CY に変換してみましたが、同じ結果が得られました。

また、派生列を使用して、DT_STR フィールド Col003 を (DT_NUMERIC,10,2)Col003 にキャストし、それを (DT_CY)Col003_Numeric にキャストしてみました。キャストエラーが発生しています。

4

3 に答える 3

2

フラット ファイルのデフォルトでは、すべてのフィールドが DT_STR になります。数値フィールドを float (DT_R4) にするには、接続を編集する際に [詳細] オプションを使用します。次に、フラット ファイル ソースの高度な編集 ([データ フロー] タブ) で、その出力列を money (DT_CY) に設定します。

次に、フィールドは追加の変換なしで変換されます。この問題は、ソース ファイルの定義を DT_STR のままにしておくことでした。

于 2012-01-27T23:32:34.287 に答える
1

私のシナリオでは何らかの理由で、OLE DB Destination実際にを受け入れるように構成されていましたDT_CY。ただし、この形式にキャストすると (入力データと宛先データの長さに関係なく、データがNULL到着したかどうかに関係なく)、常に同じ問題が発生しました。

データ ビューアーを追加した後、これはロケールと関係があると結論付けることができます。ここデンマークでは、コンマ ( ,) を 10 進数の区切り記号として、ドット ( .) を 3 桁ごとの区切り記号として使用しています。

これは、 のような膨大な数382,939,291,293.38が ( への変換後DT_CY) のように見えることを意味します382.939.291.293,38。それが問題である可能性を非常に疑っていましたが、当初の意図とは逆のことをすることにしました。

私の高度な設定に移動し、代わりに列のタイプをにOLE DB Destination変更することにしました。次に、変換を追加し、次の式を入力して、データが宛先に到着する前に列を変換しました。DT_CYDT_STRDerived Column

REPLACE(SUBSTRING(Price, 2, 18), ",", ".")Price列の名前はどこにありましたか。

驚いたことに、これで問題が解決しましOLE DB Destinationた。SQL Server が完全に理解できる文字列としてデータを送信していることがわかったからです。

これはバグだと確信しています!SQL Server 2008 を使用していたので、それ以降のエディションで解決されている可能性があります。しかし、そのような本質的なことが正しく機能していないことは非常に重大です。

于 2013-08-19T14:23:02.293 に答える
1

null 値がない場合は、データ変換を使用し、おかしな文字がないことを確認します (例: US$200 はエラーを生成します)。

フィールドに null または空のフィールドがあり、フラット ファイル ソースを使用している場合は、[ソースから null 値を返す..] にチェックを入れてください。

私が使用した別のトリックは次のようなものです:(taxvalue != "" ? taxvalue : NULL(DT_WSTR,50)).派生列変換 (フィールドを置き換えるだけです)

通常、SSIS は空の文字列を適切に金額に変換しません。

于 2012-01-23T21:28:09.223 に答える