2017-09-23 43 views
1

我有一个关于SQL Server的问题:如何将科学记数值转换为整数值?如何使用SQL Server处理列中的混合数据类型值

我们有一些账单号码被转换为科学记数法。这意味着它们的帐单号码格式不正确,应该转换回正常的十进制或数字格式。

我遇到困难转换只有那些具有科学记数法的值。

该列为nvarchar(255)数据类型,但这些值需要操纵回numericdecimal数据类型。

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
Arithmetic overflow error converting float to data type numeric.

我需要获取所有记录相关的输出信息。你能告诉我如何在SQL Server中执行此操作吗?

回答

0

在SQL Server 2012+你可以使用:

SELECT TRY_CAST(TRY_CAST(billno AS FLOAT(54)) AS BIGINT) 
FROM test; 

反正你应该可以解决应用程序如何保存价值。将它们存储为FLOAT是个坏主意(FLOAT不是精确的数据类型)。

相关问题