Nettoyage des données SQL comportant des périodes en tant que valeurs manquantes

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