将数值错误地存储为SQL文本

时间:2015-03-09 15:44:49

标签: sql-server

我有一个.csv文件,我是从第三方收到的 - 因此我无法从源头对问题进行排序。 .csv文件分隔如下:

"1","client_name","0","0"
"2","client_name","0","0"

我已成功将文件加载到临时表中,所有列都存储为varchar(255)。我无法将第4列转换为decimal(10,0)。哪个是实时目标表的数据类型。

奇怪的是,第3列和第4列只包含零,第3列可以转换为decimal(10,0),但第4列则不能。{/ p>

ISNUMERIC(REPLACE(credit_terms, '"', ''))

第4列中的所有行都返回0,但第3列中的所有行都返回1。

CAST(REPLACE(credit_terms, '"', '') AS DECIMAL(10,0))

返回错误:

  

Msg 8114,Level 16,State 5,Line 1
  将数据类型varchar转换为数字时出错。

奇怪的是,表面上看起来像一个相同的列(3)的内容会很好,但是4会不会。

我完全理解将数字存储为文本是不好的做法,但由于数据来自其他地方,我无法解决此问题。

以下建议我现在用十六进制编辑器打开文件。在每一行的末尾是一个如下所示的换行符:..(Od & Oa)。

在十六进制编辑器中,每一行都如下所示:

"1","client_name","0","0",..
"2","client_name","0","0",..

4 个答案:

答案 0 :(得分:1)

确保没有隐藏空间" "最后0后的字符;这在excel / csv文件中可能会发生很多。这会导致它无法转换为数字。
另外,请确保您的索引正确无误。很多东西都是从0索引开始的,所以你可能试图转换列[4],它与第5个逻辑列相关吗?

答案 1 :(得分:0)

我强烈建议您下载UltraEdit的免费试用版,然后打开它,打开上述文件之一,按Ctrl-H进入十六进制模式,这样您就可以查看每个角色的十六进制/ ASCII码在一个文件中(即使是不可见的文件)和眼球,还有任何字符无法看到会导致上述转换错误。

我一直看到大型机生成的文件,这些文件会添加阻碍后续导入的字符。

此外,由于您已在SQL中加载它,请执行快速SELECT LEN(Column4)以查看它是否返回除1之外的任何内容。

更好的是,执行SELECT Column4 FROM YourTable WHERE ISNUMERIC(Column4)= 0以返回具有违规值的集合。

答案 2 :(得分:0)

尝试使用TRY_CAST查找不会转换的值;

select * from MyTable
where TRY_CAST(REPLACE(credit_terms, '"', '') AS DECIMAL(10,0)) is null

答案 3 :(得分:0)

根据这个问题的建议,我发现数据的换行符是OA和OD。

0A是换行符 0D是回车

然后我能够替换char(10) - 换行和char(13) - 回车如下:

CAST(REPLACE(REPLACE(REPLACE(credit_terms,char(10),''),CHAR(13),''),'"','') AS DECIMAL(10,0))

该列现在将根据需要转换为小数。谢谢你的所有指示。