money数据类型的SQL Server逗号分隔符



我通过SSIS将Excel文件导入SQL Server。我有一个临时表,可以在nvarchar中获取所有内容。对于四列,我将字符串强制转换为money类型并放入目标表中。

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

所以现在在我的目标表中,我有逗号值的所有内容,但X列现在将逗号向右移动了两个位置,看起来像这样:

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

我认为这是一个区域性设置问题,但话说回来,它应该或不应该在所有这些列上工作。

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

b) 我该怎么解决这个问题?我可以用一个点代替临时表中的","吗?

更新

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

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

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

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

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

HTH

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

最新更新