这个问题可能在很多线程上都可以回答,但是我找不到针对我问题的答案。
Q:我从API(以json格式)获取数据,其中所有列均以字符串形式出现,并插入到具有所有列作为字符串并用作源表的表中。
现在,我正在尝试将数据从该源强制转换为目标,并进行所有必要的强制转换以将数据插入目标表。但是十进制(16,8)转换失败。
我最终调试了一个问题,发现在从API提取数据期间,该过程会将数据返回为json格式,从而将值转换为某种异常格式。
例如0.00007转换为7E-05,其他许多行都在发生这种情况。
我知道我可以在API实施级别解决此问题。但是我要求在SQL Server端解决此问题。因此,我需要一个将7E-05转换为0.00007的解决方案。
答案 0 :(得分:5)
尝试类似的东西:
SELECT CAST(CAST(@t AS FLOAT) AS DECIMAL(16,8))
结果:
0.00007000
CAST
到FLOAT
,然后到DECIMAL
。
答案 1 :(得分:2)
这种不寻常的格式是一种相当常见的科学符号 Wikipedia, read section "E-notation"
您看到E
和一个数字,表示指数。
"1E2" = 1 * 10^2 = 100
"1E-2" = 1 * 10^(-2) = 0.01
尝试一下:
DECLARE @tbl TABLE(Numberstring VARCHAR(100));
INSERT INTO @tbl VALUES('100'),('1E2'),('1E-2'),('7E-05');
SELECT Numberstring
,CAST(Numberstring AS FLOAT)
,CAST(CAST(Numberstring AS FLOAT) AS DECIMAL(20,10))
FROM @tbl;
结果
100 100 100.0000000000
1E2 100 100.0000000000
1E-2 0,01 0.0100000000
7E-05 7E-05 0.0000700000
您会看到FLOAT
类型本身将显示科学计数法中的最后一个数字,而对DECIMAL
的强制类型转换将返回您期望的数字。
我对投票表示满意,但您应该接受肖恩的回答,因为它早于我的回答:-D