2010-07-29 4 views
1

Je migre des données d'une table vers une nouvelle table. L'ancienne table utilise FLOAT et dans la nouvelle table j'utilise DECIMAL comme attribut de champ.Conversion de données flottantes en données décimales par migration

J'utilise la déclaration suivante qui a bien fonctionné: CAST (OLD_COLUMN_NAME comme DECIMAL (9,2) AS « NEW_COLUMN_NAME »

qui fonctionne comme un charme jusqu'à ce que je frappe la bosse sur la route Le vieux données. est défini comme float, null, le nouveau champ est défini comme décimal (5,5) .Je comprends que decimal (5,5) nécessitera toutes les données derrière la décimale pour 5 positions.Je me demande si elles sont un moyen de gérer cette Problème de déplacement des données d'un champ de données flottantes vers un champ de données décimal

Les données d'entrée provenant de l'ancien champ sont variées et ressemblent à ceci: 5, 0.5, 0.5, 0.75, 2 et ainsi de suite

L'erreur que je reçois est:

Msg 8115, Level 16, State 6, Line 8 Arithmetic overflow error converting float to data type numeric.The statement has been terminated.

Le code est contre une base de données SQL Server 2005 en utilisant SQL Server 2008. Vous ne savez pas cette question est importante, mais je pense inclure cette information.

Quelqu'un pourrait-il nous éclairer sur la façon de résoudre ce problème de conversion de données? Je vous remercie!

Répondre

1

Je recommanderais de faire quelque chose comme ça.

Cast(Round(field, 5) As Decimal(5, 5)) 
+0

essayé et a obtenu le errorMsg 8115, niveau 16, état 6, ligne 17 dépassement Arithmétique Erreur lors de la conversion de float en type de données numérique. – JMS49

+0

vérifier que j'ai réessayé ceci. Voici le code: sélectionner Top 700 CONVERT (VARCHAR (13), cLehmanNo) \t sous 'LOAN_NUMBER' , CONVERT (VARCHAR (3), cInvestorID) sous 'INVESTOR_ID' , CAST (ROUND (fLateChargeFact, 5) en décimal (5,5)) eN \t # LTS_MAP2 dE Loanmaster maintenant, je reçois cette erreur: Msg 1038, niveau 15, état 5, ligne 8 Un objet ou le nom de la colonne est manquante ou vide. Pour les instructions SELECT INTO, vérifiez que chaque colonne a un nom. Pour les autres instructions, recherchez les noms d'alias vides. Les alias définis comme "" ou [] ne sont pas autorisés. Changez l'alias en un nom valide. – JMS49

2

Decimal(5, 5) a seulement une gamme - 0,99999 à 0,99999 +

mais vous dites que vous essayez de mettre 5 et 2 en elle. Avez-vous besoin de Decimal(10, 5)? Si non, vous avez en effet été laissé un peu d'une énigme.

Je mentionne ce qui suit comme un point d'intérêt plutôt qu'une suggestion sérieuse, cependant, qui sait, il peut être utile!

Si la colonne est annulable une façon de fullfill vos patrons exigences seraient

create table #t (j int,i Decimal(5, 5) null) 

set ansi_warnings off 
set arithabort off 

insert into #t values(1,0.2345678) 
insert into #t values(2,10) 
insert into #t values(3,0.455464) 

select * from #t 

Sortie

Arithmetic overflow occurred. 
j   i 
----------- ------------------------------ 
1   0.23457 
2   NULL 
3   0.45546 
+0

Je comprends mais je ne peux pas changer le format de sortie, mon patron veut le voir comme Decimal (5,5). Je ne sais pas comment faire. – JMS49

+0

J'allais suggérer cela, mais était trop paresseux pour rechercher les chiffres réels. – ChaosPandion

+0

@ JMS49 - Dites à votre patron de résoudre le problème alors. – ChaosPandion

1

Est-ce que votre patron comprendre que décimal (5,5) ne permettra pas à quoi que ce soit à la gauche de la virgule décimale?

Demandez à votre patron ce qu'il veut en anglais. Si votre patron vous demande vraiment de stocker des nombres supérieurs à .99999, mais insistez spécifiquement sur "décimal (5,5)", il est clair qu'ils ne comprennent pas ce qu'ils demandent. Le premier « 5 » en décimal (5,5) se réfère au nombre total de chiffres du nombre (avant et après combiné)

Questions connexes