我通过SSIS将Excel文件导入SQL-Server。我有一个临时表来获取nvarchar中的所有内容。对于四列我然后将字符串转换为money类型并放入我的目标表。
在我的临时表中,这四列中的一列让我称之为X有一个逗号作为分隔符,其余的有一个点。不要问我为什么,我的SSIS设置中的所有内容都一样。 在我的Excel中,分隔符也是逗号。
所以现在在我的目标表中我有所有逗号值,但是X列现在将逗号移动到右边的两个位置,看起来像这样:
537013,00 而不是 5370,13 ,这是temp和excel列中的原始单元格值。
我认为这是一个文化设置问题但是它应该或不应该适用于所有这些列。
a)当我的Excel显示逗号时,为什么我会在临时表中收到点值?
b)我该如何解决这个问题?我可以用点?替换临时表中的“,”吗?
更新
我想我找到了原因但不是解决方案:
在excel的这个X列中,前三个单元格都是空的 - 其他三个列都以0开头。如果我用0填充X的这三个单元格,那么我也得到临时表中的点和正确的值我的目标表。但当然我必须按原样使用Excel文件。 有什么想法?
答案 0 :(得分:0)
尝试以下代码。它检查转换为money的字符串值是否为数字数据类型。如果字符串值是数值数据类型,则将其转换为货币数据类型,否则返回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)
至于为什么你得到逗号而不是dot我没有任何线索。我的第一个猜测是文化设置,但你已经检查过了。谷歌搜索怎么样,你有没有得到一些结果?
答案 1 :(得分:0)
首先,SQL中的“分隔符”是小数点:它只是使用逗号的excel。您可以在Excel中更改格式:您应该将excel列格式化为money并指定小数点作为分隔符。然后在SSIS导入向导中拆分列的转换,以便导入到货币数据类型。它是一种文化的东西,但是分隔符倾向于在表示一列的结尾和下一列的开头(如在csv中)的上下文中使用
HTH
答案 2 :(得分:0)
这是excel长期存在的问题。它使用前30行左右来推断数据类型。它可能导致无穷无尽的问题。我认为你的解决方案必须以Yaroslav建议的方式处理所有字符串,或提供excel模板以获得数据预定义和格式化的数据类型列,然后插入值。它是一个皮塔饼。