如何使用SQL Server处理列中的混合数据类型值

时间:2017-09-23 06:35:47

标签: sql-server-2008 sql-server-2012

我对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
  将float转换为数据类型numeric的算术溢出错误。

我需要获取所有记录相关的输出信息。你能告诉我在SQL Server中如何做到这一点吗?

1 个答案:

答案 0 :(得分:0)

在SQL Server 2012+中,您可以使用:

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

无论如何,您应该修复应用程序如何保存值。将它们存储为FLOAT是个坏主意(FLOAT不是精确的数据类型)。