2017-09-23 3 views
1

J'ai une question à propos de SQL Server: comment convertir une valeur de notation scientifique en valeurs entières?Comment gérer des valeurs de type de données mixtes dans des colonnes à l'aide de SQL Server

Nous avons des numéros de facture qui ont été convertis en notation scientifique. Cela signifie qu'ils sont dans le mauvais format pour les numéros de facture et doivent être reconvertis au format décimal ou numérique normal.

Je rencontre des difficultés pour convertir uniquement les valeurs qui ont la notation scientifique.

La colonne est du type de données nvarchar(255) mais ces valeurs doivent être retraitées en numeric ou 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') 

J'ai essayé comme ça, mais si je lance cette requête:

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') 

alors ce sont les résultats:

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 

Si je lance cette requête:

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 

Ensuite, je reçois une erreur:

Msg 8115, Level 16, State 6, Line 2
Arithmetic overflow error converting float to data type numeric.

Je dois obtenir toutes les informations de sortie liées aux enregistrements. Pouvez-vous s'il vous plaît me dire comment faire cela dans SQL Server?

Répondre

0

Dans SQL Server 2012+ vous pouvez utiliser:

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

Quoi qu'il en soit, vous devriez corriger la façon dont les valeurs sauvegarde application. Les stocker comme FLOAT est une mauvaise idée (FLOAT n'est pas un type de données précis).