2

我通过 SSIS 将 Excel 文件导入 SQL-Server。我有一个临时表来获取 nvarchar 中的所有内容。然后,对于四列,我将字符串转换为货币类型并放入我的目标表中。

在我的临时表中,这四列之一让我称之为 X 有一个逗号作为分隔符,其余的有一个点。不要问我为什么,我的 SSIS 设置中的所有内容都是一样的。在我的 Excel 中,分隔符也是逗号。

因此,现在在我的目标表中,我将所有内容都放在逗号值中,但是 X 列现在将逗号向右移动了两个位置,如下所示:

537013,00而不是5370,13,这是 temp 和 excel 列中的原始单元格值。

我在想这是一个文化设置问题,但它应该或不应该在所有这些列上工作。

a) 为什么当我的 Excel 显示逗号​​时,我的临时表中会收到点值?

b)我该如何解决这个问题?我可以用点替换临时表中的“,”吗?

更新

我想我找到了原因,但没有找到解决方案:

在excel的这个X列中,前三个单元格是空的 - 其他三列都以0开头。如果我用0填充这三个X单元格,那么我也会在我的临时表中得到点,在我的目标表中得到正确的值. 但当然我必须按原样使用 Excel 文件。有什么想法吗?

4

3 回答 3

0

试试下面的代码。它检查被转换为货币的字符串值是否是数字数据类型。如果字符串值是数字数据类型,则将其转换为货币数据类型,否则返回 NULL 值。它还替换了字符串值的小数符号和数字分组符号,以匹配 SQL Server 的预期小数符号和数字分组符号。

DECLARE @MoneyString VARCHAR(20)
SET @MoneyString = '$ 1.000,00'
SET @MoneyString = REPLACE(REPLACE(@MoneyString, '.', ''), ',', '.')
SELECT CAST(CASE WHEN ISNUMERIC(@MoneyString) = 1
                 THEN @MoneyString
                 ELSE NULL END AS MONEY)

至于你得到逗号而不是点的原因,我不知道。我的第一个猜测是文化背景,但你已经检查过了。谷歌搜索怎么样,你得到了一些结果吗?

于 2012-09-07T10:43:32.680 回答
0

首先,SQL 中的“分隔符”是小数点:它唯一使用逗号的 excel。您可以更改 excel 中的格式:您应该将 excel 列格式化为货币并指定小数点作为分隔符。然后在 SSIS 导入向导中拆分列的转换,以便将其导入到货币数据类型。它是一种文化的东西,但分隔符往往用于表示一列的结尾和下一列的开始(如在 csv 中)

高温高压

于 2012-09-07T10:46:09.403 回答
0

那是excel长期存在的问题。它使用前 30 行左右来推断数据类型。它可能导致无穷无尽的问题。我认为您的解决方案必须是按照 Yaroslav 建议的方式将所有内容作为字符串处理,或者提供一个 excel 模板来预定义数据和格式化数据类型列,然后插入这些值。它是一个皮塔饼。

于 2012-09-08T11:12:13.363 回答