我对SQL Server有疑问:如何将科学记数法值转换为整数值?
我们有一些账单编号转换为科学记数法。这意味着它们的帐单编号格式错误,应该转换回常规的十进制或数字格式。
我在转换那些具有科学记数法的值时遇到了困难。
该列属于nvarchar(255)
数据类型,但需要将这些值操作回numeric
或decimal
数据类型。
CREATE TABLE [dbo].[test]
(
billno [nvarchar](255) NULL
) ON [PRIMARY]
GO
INSERT INTO [dbo].[test] (billno) VALUES (N'9.2091002309e+012')
INSERT INTO [dbo].[test] (billno) VALUES (NULL)
INSERT INTO [dbo].[test] (billno) VALUES (N'4.0206570015e+019')
INSERT INTO [dbo].[test] (billno) VALUES (N'9.2091002204e+013')
INSERT INTO [dbo].[test] (billno) VALUES (N'SEALED05/10/2016')
INSERT INTO [dbo].[test] (billno) VALUES (N'3101123631')
INSERT INTO [dbo].[test] (billno) VALUES (N'57108')
INSERT INTO [dbo].[test] (billno) VALUES (N'9.1108000026e+014')
INSERT INTO [dbo].[test] (billno) VALUES (N'97033429A')
INSERT INTO [dbo].[test] (billno) VALUES (N'5.0846721402e+017')
我试过这样,但是如果我运行这个查询:
SELECT
CASE
WHEN billno like '%E+%'
THEN CAST(CAST(CAST(billno AS FLOAT) AS numeric) AS NVARCHAR(255))
ELSE billno
END expectedresult,
billno
FROM
test324.dbo.test
WHERE
billno NOT IN ('4.0206570015e+019', '5.0846721402e+017')
然后就是结果:
expectedresult |billno
----------------+------------------
9209100230900 |9.2091002309e+012
92091002204000 |9.2091002204e+013
SEALED05/10/2016| SEALED05/10/2016
3101123631 |3101123631
57108 |57108
911080000260000 |9.1108000026e+014
97033429A |97033429A
170668650010000 |1.7066865001e+014
如果我运行此查询:
SELECT
CASE
WHEN billno LIKE '%E+%'
THEN CAST(CAST(CAST(billno AS FLOAT) AS numeric) AS NVARCHAR(255))
ELSE billno
END test,
billno
FROM
test
然后我收到错误:
Msg 8115,Level 16,State 6,Line 2
将float转换为数据类型numeric的算术溢出错误。
我需要获取所有记录相关的输出信息。你能告诉我在SQL Server中如何做到这一点吗?
答案 0 :(得分:0)
在SQL Server 2012+中,您可以使用:
SELECT TRY_CAST(TRY_CAST(billno AS FLOAT(54)) AS BIGINT)
FROM test;
无论如何,您应该修复应用程序如何保存值。将它们存储为FLOAT
是个坏主意(FLOAT
不是精确的数据类型)。