这个问题可能会在许多线程上回答,但我无法找到特定于我的问题的答案。
问:我从API(以json格式)获取数据,其中所有列都以字符串形式出现并插入到一个表中,该表将所有列作为字符串并用作源表。
现在,我正在尝试将数据从该源转换为目标,并进行所有必要的转换以将数据插入目标表。但十进制(16,8)投射失败。
我在我的端调试问题,并发现在从API获取数据期间,将数据返回到json格式,以某种不寻常的格式转换值。
对于例如0.00007转换为7E-05,这发生在许多其他行上。
我知道我可以在API实现级别修复此问题。但我要求在SQL服务器端解决这个问题。所以我需要一个能将7E-05转换成0.00007的解决方案。
这种不寻常的格式是一种相当常见的科学符号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
的演员将返回您期望的数字。
我会对upvote感到满意,但是你应该接受Shawn的答案,因为它早于我的答案:-D
尝试类似的东西:
SELECT CAST(CAST(@t AS FLOAT) AS DECIMAL(16,8))
结果是:
0.00007000
CAST
到FLOAT
,然后到DECIMAL
。