7
votes

Conversion / casting d'un nvarchar avec séparateur de virgule en décimale

Je supporte un processus ETL qui transforme les entrées de fichiers plats en une table de base de données SQLServer. Le code est presque 100% T-SQL et fonctionne à l'intérieur de la DB. Je ne possède pas le code et je ne peux pas changer le flux de travail. Je ne peux que vous aider à configurer la "traduction" SQL qui prend les données de fichier et la convertit sur les données de tableau (plus tard ultérieurement).

Maintenant que les responsabilités sont hors de la route ...

Un de nos fournisseurs de fichiers a récemment modifié la manière dont ils représentent une quantité monétaire du '12345.67' à '12, 345.67 '. Notre SQL qui transforme la valeur ressemble à SELECT SELECT (CAST ([INPUTVALUE] comme décimal (24,10))) et ne fonctionne plus. C'est-à-dire que la virgule brise la distribution.

étant donné que je dois stocker la valeur finale comme décimal (24,10) DataType (Oui, je réalise le plancher Wipes sur tous les postes décimales -Point de précision - Le concepteur n'était pas synchronisé avec le client) , que puis-je faire pour lancer cette chaîne efficacement? '

Merci pour vos idées.


2 commentaires

Est-ce que l'une de ces réponses a résolu votre problème?


@Km: Je discute de ces suggestions avec notre groupe DBA maintenant. À ma fin, l'approche commune proposée (en utilisant Remplacer ()) semble fonctionner. Va mettre à jour bientôt.


4 Réponses :


10
votes

Essayez d'utiliser Remplacer (transact-sql) : xxx

sortie: xxx

de sorte que ce serait: xxx


1 commentaires

+1 ... remplacer puis couler, de sorte que votre fonctionnalité d'origine est conservée.



1
votes

Cela fonctionne pour moi:

DECLARE @foo NVARCHAR(100)
SET @foo='12,345.67'

SELECT FLOOR(CAST(REPLACE(@foo,',','') AS DECIMAL(24,10)))


2 commentaires

Vous soulevez un bon point, David. Je sais que certaines des intrants proviennent d'Europe et d'Asie - qui pourraient gâcher toutes les manipulations de chaîne avec des virgules à la chaîne vide. Je vais devoir faire un suivi avec le client à ce sujet.


Il serait préférable d'avoir votre application détecter les paramètres régionaux de l'utilisateur, convertir en une décimale dactylographiée, puis transmettre au serveur SQL en tant que valeur décimale dactylographiée. Le problème disparaît.



1
votes

Sélectionnez le sol (coulé (remplacer ([INPUTVALUE], ',' ',' ') comme décimal (24,10)))


0 commentaires

2
votes

Pas nécessairement la meilleure approche pour ma situation, je voulais laisser une solution potentielle pour une utilisation future que nous avons découverte tout en recherchant ce problème.

Il apparaît que le type SQLServer DataType Argent peut être utilisé comme coule direct pour les chaînes avec une virgule séparant la partie non décimale. Donc, où Sélectionnez Cast ('12, 345.56 'comme décimal (24,10)) échoue, Sélectionnez Cast ('12, 345.56' comme argent) va réussir.

Une mise en garde est que le type de données d'argent a une précision de 4 décimales et nécessiterait une mise en forme explicite pour l'obtenir sur décimal , si vous en avez besoin.


0 commentaires