ssisソースが2つ以上の小数を持っている場合、文字列(dt_str)をお金に変換する方法(dt_cy)
-
29-10-2019 - |
質問
24.209991などの値を持つソースフラットファイルがありますが、SQL Serverにタイプマネーとしてロードする必要があります。 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にキャストしようとしました。キャストエラーが発生しています。
解決
フラットファイルは、すべてのフィールドがDT_STRであることをデフォルトします。接続の編集時に高度なオプションを使用して、数値フィールドをフロート(DT_R4)として使用します。次に、フラットファイルソースの高度な編集(データフロータブ)で、その出力列をMoney(DT_CY)に設定します。
その後、フィールドは追加の変換なしで変換されます。問題は、ソースファイルの定義をDT_STRとして残すことでした。
他のヒント
null値がない場合はデータ変換を使用し、面白い文字がないことを確認してください(たとえば、200米ドルのプロデュースエラー)
フィールドにnullまたは空のフィールドがあり、フラットファイルソースを使用している場合は、「ソースからnull値を返す」を確認してください。
私が使用したもう1つのトリックは、次のようなものです。 (taxvalue != "" ? taxvalue : NULL(DT_WSTR,50)).
派生列変換で(フィールドを交換することができます)
通常、SSISは空の文字列を適切にお金に変換しません。
私のシナリオの何らかの理由で、 OLE DB Destination
実際に だった 受け入れるように構成a DT_CY
. 。ただし、この形式にキャストします(入力データと宛先データの長さに関係なく、データは関係に関係なく、データは NULL
到着したとき)は常に同じ問題を引き起こしました。
データ視聴者を追加した後、これはロケールと関係があると結論付けることができます。ここデンマークでは、コンマを使用しています(,
)小数の区切り文字とドットとして(.
)反対の代わりに、数千の派生物として。
これは、膨大な数のようなものを意味します 382,939,291,293.38
(変換後 DT_CY
) のように見える 382.939.291.293,38
. 。私はそれが問題になる可能性があることを非常に疑っていましたが、私は 反対 私が元々意図していたものの。
私は自分の高度な設定に行くことにしました OLE DB Destination
そして、変更します DT_CY
列のタイプへ DT_STR
代わりは。次に、aを追加しました Derived Column
変換し、列を変換するために次の式を入力しました 前 データは目的地に到着します。
REPLACE(SUBSTRING(Price, 2, 18), ",", ".")
どこ Price
列の名前でした。
私の大きな驚きに、これは問題を解決しました。 OLE DB Destination
現在、データを文字列として送信していましたが、SQLサーバーは完全に正常に理解されていました。
これがバグだと確信しています! SQL Server 2008を使用していたので、後のエディションで解決された可能性があります。しかし、そのような重要なことが正しく機能していないことが非常に重要です!