J'essaie de déplacer des données d'une table avec des colonnes varchar vers une table avec des colonnes numériques. Voici un exemple de valeurs dans une colonne, où parfois une période sera utilisée pour indiquer une valeur manquante.
Column1 0.00 4.80 . . 0.00 . 0.00 .
'Erreur lors de la conversion du type de données varchar en numérique.' apparaît quand il atteint les périodes. Comment puis-je gérer les périodes (en les supprimant ou en les modifiant à 0.00) afin de continuer à copyr datatables dans la nouvelle table?
Pour reference, voici le code que j'utilise:
INSERT INTO [CORE] [NumberDone] ,[Charges] SELECT LEFT([Column0],8) ,LEFT([Column1],8) FROM [TempTbl];
Si 2012+, Try_Convert () peut aider ici. Non seulement Try_Convert () interceptera la décimale simple, mais toutes les autres strings inattendues.
Exemple
Declare @YourTable Table ([Column1] varchar(50)) Insert Into @YourTable Values ('0.00') ,('4.80') ,('.') ,('.') ,('0.00') ,('.') ,('0.00') ,('.') Select Try_Convert(decimal(10,2),Column1) from @YourTable
Résultats
0.00 4.80 NULL NULL 0.00 NULL 0.00 NULL
NOTE : Si vous préférez Zeros, IsNull(Try_Convert(decimal(10,2),Column1),0)
Donc, pour l'insertion réelle
insert into [core] ([NumberDone], [Charges]) select try_convert(decimal(10,2),Column0) , try_convert(decimal(10,2),Column1) from [TempTbl];
Vous pouvez utiliser nullif()
pour activer '.'
en null
:
insert into [core] ([NumberDone], [Charges]) select left(nullif([Column0], '.'), 8) , left(nullif([Column1], '.'), 8) from [TempTbl];
rextester demo: http://rextester.com/DIVNJ65404
create table TempTbl ([Column1] varchar(50)); insert into TempTbl values ('0.00'),('4.80'),('.'),('.') ,('0.00'),('.'),('0.00'),('.'); select Column1 = left(nullif([Column1], '.'), 8) from [TempTbl];
résultats:
+---------+ | Column1 | +---------+ | 0.00 | | 4.80 | | NULL | | NULL | | 0.00 | | NULL | | 0.00 | | NULL | +---------+
Vous pouvez envelopper ceci dans isnull()
ou coalesce()
pour transformer null
en 0
.
insert into [core] ([NumberDone], [Charges]) select isnull(left(nullif([Column0], '.'), 8),0) , isnull(left(nullif([Column1], '.'), 8),0) from [TempTbl];
Utilisez quelque chose comme
case when charges='.' then 0 else cast(charges as double precision) end