How to convert a string to money in the Data Conversion Transformation process in SSIS?
如何在SSIS中的数据转换转换过程中将字符串转换为货币?
我的源文件是一个 Excel 文件。我添加了数据转换转换以将 Price 列转换为数据类型 "currency[DT_CY]".
1 2 3
| SOURCE VALUE : $50,240.30
Expected RESULT : 50240.30 |
SQL Destination 表的列价格为数据类型:Money
但是,转换失败并出现以下错误:
1
| 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"数据类型加载到表中时获取数据。
1
| SELECT CONVERT(MONEY, [Price]) AS [Price] , * FROM dbo.StagingTable |
根据 Nick\\ 的评论,源文件转换工作正常。
但是,我们需要将字符串转换为 Money 数据类型。
来源价格:$55,176.80
派生列表达式:REPLACE(REPLACE([Price],"$",""),",","")
数据类型:DT_WSTR
输出价格:55176.80
- 首先尝试删除/替换 $ 和 , 字符
-
那将在带有子字符串的派生列中,对吗?
-
是的,它在派生列中,但使用类似 REPLACE(REPLACE(<yourcolumn>,'$',''),',','') docs.microsoft.com/en-us/sql/integration-services/expression??s/...
-
我从派生列表达式中得到一个错误,如 .. ..Error at TP_Pricing DTFlow Task [派生列 [12]]: Parsing the expression "REPLACE(REPLACE(REPLACE([Price],\\'$\\',\\'\\') ),\\',\\',\\'\\')" 失败的。行号 "1"、字符号 "70" 处的单引号不是预期的。
-
哦...也许 SSIS 表达式使用 " 而不是 ' 作为字符串文字。我不记得了,帮助中不包含任何示例,请尝试 REPLACE(REPLACE(<yourcolumn>,"$",""),",","")
-
我刚刚注意到@Hadi 在他的回答中澄清了这一点 - 如果正确,请接受他的回答
-
@Nick.McDermaid 回答有效。但是,目标数据类型必须是 nvarchar(255) 。数据仅替换 $ 和 , 符号。它不会将价值转换为货币/金钱。
正如@Nick.McDermaid 所建议的,在将数据插入到 SQL Server 之前,尝试清理数据并使用派生列执行转换。还要确保检查 NULL 值。您可以使用以下表达式:
1
| ISNULL([Price]) ? NULL(DT_CY) : ([Price] =="" ? NULL(DT_CY) : (DT_CY)(REPLACE(REPLACE((DT_WSTR,50)[Price],"$",""),",",""))) |
删除 $ 符号和逗号 , 后,转换操作将正常工作。
有用的链接
-
SSIS 如何将字符串 (DT_STR) 转换为货币 (DT_CY) 当源有超过 2 位小数时
-
我正在研究这个……虽然表达被 ssis 包接受。我收到一个运行时错误 .. "Derived Column" 失败,因为发生了错误代码 0xC0049063,并且 "Derived Column.Outputs[Derived Column Output].Columns[Price]" 上的错误行处置指定了失败错误。指定组件的指定对象发生错误。在此之前可能会发布错误消息,其中包含有关失败的更多信息。错误:0xC0047022 at Pricing_Summary DTFlow 任务,SSIS.Pipeline:SSIS 错误代码 DTS_E_PROCESSINPUTFAILED。
-
那是一条消息,告诉您存在一般性错误。您需要找到告诉您实际错误的消息 在此之前可能会发布错误消息以及有关失败的更多信息
-
"Derived Column.Outputs[Derived Column Output] 上的错误行配置
-
@goofyui 这可能是由空字符串引起的。检查我更新的表达式。
-
@goofyui 也尝试只替换美元符号而不替换逗号
-
@Hadi,感谢您分享详细信息。但包裹未能处理。表达式有效。然而,包裹没有通过。
-
最后一个选项是 .. 将其加载到临时表中,然后使用 "convert(MONEY, [Price]) AS [Price] " 转换并传输回实际表。这样做会增加加载时间
-
@goofyui 你能提供一个数据样本吗
-
根据尼克,我使用了这个表达式 REPLACE(REPLACE([Price],"$","),",",") - 这有效。它替换了特殊字符并将数据作为字符串保存到具有 nvarchar(255) 的表中。挑战是,如果我将 SQL 表中的价格列设为 Money,则表达式无法加载
-
@goofyui 尝试从我的表达式中删除字符串转换。从表达式中删除 (DT_WSTR, 50)
-
@Hadi,我按照步骤删除了 DT_WSTR;但是,包失败。"派生列" 失败,因为发生了错误代码 0xC0049063,并且"派生列.输出[派生列输出].Columns[价格]"上的错误行配置指定错误时失败。指定组件的指定对象发生错误。在此之前可能会发布错误消息,其中包含有关失败的更多信息。错误:0xC0047022 at Pricing_Summary DTFlow 任务,SSIS.Pipeline:SSIS 错误代码 DTS_E_PROCESSINPUTFAILED。
-
@goofyui 尝试使用错误输出来检查导致错误的值 google.com/amp/s/www.josefrichberg.com/journal/2012/2/1/...
-
@Hadi .. 我决定将所有记录填充到临时表,然后从那里重新格式化为实际表。目前,我们很好。谢谢
-
@goofyui 乐于助人。如果这个答案不能解决问题。写下你自己的答案并接受它。否则接受答案以结束问题
我认为你必须像这样使用 CONVERT :
您可以找到有关 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。所以十进制到货币的转换失败