2017-09-23 44 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不是精確的數據類型)。

相關問題