【问题标题】:SQL Server comma delimiter for money datatype金钱数据类型的 SQL Server 逗号分隔符
【发布时间】:2012-09-07 10:34:48
【问题描述】:

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

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

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

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

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

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

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

更新

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

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

【问题讨论】:

    标签: sql sql-server ssis delimiter


    【解决方案1】:

    试试下面的代码。它检查被转换为货币的字符串值是否是数字数据类型。如果字符串值是数字数据类型,则将其转换为货币数据类型,否则返回 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)
    

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

    【讨论】:

      【解决方案2】:

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

      HTH

      【讨论】:

      • 我不能使用除 nvarchar 之外的任何内容是有原因的,因为这些数字列在 Excel 中可能全部为空,甚至可能包含文本(被用户放错位置)
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-06
        • 1970-01-01
        • 1970-01-01
        • 2012-02-21
        • 1970-01-01
        • 2017-11-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多