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

货币数据类型的SQL Server逗号分隔符,sql,sql-server,ssis,delimiter,Sql,Sql Server,Ssis,Delimiter,我通过SSIS将Excel文件导入SQL Server。我有一张临时表,可以在nvarchar中获取所有信息。对于四列,我将字符串转换为money类型,并放入我的目标表中 在我的temp表中,这四列中的一列让我称之为X,它有一个逗号作为分隔符,其余的有一个点。不要问我为什么,我的SSI中的所有内容都设置为相同。 在我的Excel中,分隔符也是逗号 因此,现在在我的目标表中,所有内容都是逗号值,但X列现在将逗号向右移动两处,如下所示: 537013,00而不是5370,13,后者是temp和exc

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

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

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

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

我认为这是一个文化设置问题,但它应该或者不应该适用于所有这些专栏

a) 当Excel显示逗号时,为什么在临时表中接收点值

b) 我怎样才能解决这个问题?我可以用圆点替换临时表中的“?”

更新

我想我找到了原因,但没有找到解决办法:

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

试试下面的代码。它检查转换为货币的字符串值是否为数字数据类型。如果字符串值为数字数据类型,则将其转换为货币数据类型,否则返回空值。它还替换字符串值的十进制符号和数字分组符号,以匹配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 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导入向导中拆分列的转换,以便将其导入到货币数据类型。这是一种文化现象,但分隔符往往用于表示一列的结束和下一列的开始的上下文(如csv)

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


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

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

有一个原因,我不能使用nvarchar以外的任何东西,因为这些数字列在Excel中可能都是空的,甚至可能包含文本(用户放错了位置)。有一个原因,我不能使用nvarchar以外的任何东西,因为这些数字列在Excel中可能都是空的,甚至可能包含文本(用户放错了位置)