【问题标题】:How to convert a string to money in the Data Conversion Transformation process in SSIS?如何在SSIS中的数据转换转换过程中将字符串转换为货币?
【发布时间】:2019-06-09 23:14:11
【问题描述】:

如何在SSIS中的数据转换转换过程中将字符串转换为货币?

我的源文件是一个 Excel 文件。我添加了数据转换转换以将Price 列转换为数据类型“currency[DT_CY]”。

Source value : $50,240.30

Expected result : 50240.30

SQL 目标表的价格列的数据类型为:Money

但是,转换失败并出现以下错误:

The "Data Conversion.Outputs[Data Conversion Output].Columns[Price]" failed because error code 0xC020907F occurred, and the error row disposition on "Data Conversion.Out

这个查询工作..很好..但是,这个查询只有在我们收到表的数据后才会应用。

我们正在尝试在将数据作为“Money”数据类型加载到表中时获取数据。

select convert(MONEY, [Price]) AS [Price] , * from dbo.StagingTable

根据 Nick 的评论,源文件转换工作正常。 但是,我们需要将字符串转换为 Money 数据类型。

来源价格:55,176.80 美元

派生列表达式:REPLACE(REPLACE([Price],"$",""),",","") 数据类型:DT_WSTR

输出价格:55176.80

【问题讨论】:

  • 先尝试删除/替换 $, 字符
  • 那将在派生列中带有 substring ,对吧?
  • 是的,它在派生列中,但使用类似REPLACE(REPLACE(<yourcolumn>,'$',''),',','')docs.microsoft.com/en-us/sql/integration-services/expressions/…
  • 哦...也许 SSIS 表达式使用 " 而不是 ' 用于字符串文字。我不记得了,帮助不包含任何例子,试试REPLACE(REPLACE(<yourcolumn>,"$",""),",","")
  • 我刚刚注意到@Hadi 在他的回答中澄清了这一点 - 如果它是正确的,请接受他的回答

标签: sql sql-server ssis etl sql-server-data-tools


【解决方案1】:

正如@Nick.McDermaid 建议的那样,在将数据插入 SQL Server 之前,尝试清理数据并使用派生列执行转换。还要确保检查 NULL 值。您可以使用以下表达式:

ISNULL([Price]) ? NULL(DT_CY) : ([Price] == "" ? NULL(DT_CY) : (DT_CY)(REPLACE(REPLACE((DT_WSTR,50)[Price],"$",""),",",""))) 

删除$ 符号和逗号, 后,转换操作将正常工作。

有用的链接

【讨论】:

  • 我正在研究这个.. 虽然表达式被 ssis 包接受。我收到运行时错误,因为..“派生列”失败,因为发生错误代码 0xC0049063,并且“派生列.输出 [派生列输出].列 [价格]”上的错误行处置指定错误失败。指定组件的指定对象发生错误。在此之前可能会发布错误消息,其中包含有关失败的更多信息。错误:Pricing_Summary DTFlow 任务中的 0xC0047022,SSIS.Pipeline:SSIS 错误代码 DTS_E_PROCESSINPUTFAILED。
  • 这是一条消息,告诉您存在一般错误。您需要找到告诉您实际错误的消息在此之前可能会发布错误消息,其中包含有关失败的更多信息
  • "Derived Column.Outputs[Derived Column Output] 上的错误行配置
  • @Hadi,我按照步骤删除了 DT_WSTR;但是包失败。“派生列”失败,因为发生错误代码 0xC0049063,并且“派生列.输出 [派生列输出].列 [价格]”上的错误行处置指定错误失败。指定组件的指定对象发生错误。在此之前可能会发布错误消息,其中包含有关失败的更多信息。错误:Pricing_Summary DTFlow 任务中的 0xC0047022,SSIS.Pipeline:SSIS 错误代码 DTS_E_PROCESSINPUTFAILED。
  • @Hadi.. 我决定将所有记录填充到临时表中,然后从那里重新格式化为实际表。现在,我们很好。谢谢
【解决方案2】:

我认为你必须像这样使用 CONVERT :

(DT_DECIMAL,3)[Price]

您可以找到有关 CAST 函数的信息:https://docs.microsoft.com/en-us/sql/integration-services/expressions/cast-ssis-expression?view=sql-server-2017

这是在 SSIS 上执行转换的方式。

【讨论】:

  • 这是我收到的 .. 无法插入,因为不支持类型 DT_DECIMAL 和 DT_CY 之间的转换。 SQL 目标表的列数据类型为 Money。所以小数到货币转换失败
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多