2010-08-18 30 views
6

Estoy dando soporte a un proceso ETL que transforma las entradas de archivo plano en una tabla de base de datos SqlServer. El código es casi 100% T-SQL y se ejecuta dentro de la base de datos. No poseo el código y no puedo cambiar el flujo de trabajo. Solo puedo ayudar a configurar el SQL de "traducción" que toma los datos del archivo y los convierte en datos de tabla (más sobre esto más adelante).Convertir/Convertir un nVarChar con Separador de Comas en Decimal

Ahora que las renuncias son fuera del camino ...

Uno de nuestros proveedores de archivos recientemente cambió la forma en que representan una cantidad monetaria '12345.67'-'12,345.67'. Nuestro SQL que transforma el valor se ve como SELECT FLOOR(CAST([inputValue] AS DECIMAL(24,10))) y ya no funciona. Es decir, la coma rompe el elenco.

Dado que tengo para almacenar el valor final como Decimal (24,10) tipo de datos (sí, soy consciente de la FLOOR toallitas toda precisión después de la coma decimal - el diseñador no estaba en sintonía con el cliente), ¿qué puedo hacer para lanzar esta cadena de manera eficiente? '

Gracias por sus ideas.

+0

¿Alguna de estas respuestas resolvió su problema? –

+0

@KM: ahora estoy discutiendo estas sugerencias con nuestro grupo de DBA. Desde mi punto de vista, el enfoque común propuesto (utilizando Reemplazar()) parece funcionar. Se actualizará pronto. – SethO

Respuesta

7

tratar de usar REPLACE (Transact-SQL):

SELECT REPLACE('12,345.67',',','') 

SALIDA:

12345.67 

por lo que sería:

SELECT FLOOR(CAST(REPLACE([input value],',','') AS DECIMAL(24,10))) 
+0

+1 ... Reemplazar y ENTONCES lanzar, por lo que se conserva la funcionalidad original. – Fosco

1

Esto funciona para mí:

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

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

Esta es, probablemente, sólo es válida para las intercalaciones/cultura donde la coma no es el separador decimal (es decir: español)

+0

Has planteado un buen punto, David. Sé que algunas de las entradas provienen de Europa y Asia, que podrían estropear cualquier manipulación de cadenas con comas para vaciar la cadena. Tendré que seguir con el cliente sobre eso. – SethO

+0

Sería mejor que su aplicación detecte la configuración regional del usuario, convierta a un decimal escrito a máquina y luego pase al servidor sql como un valor decimal escrito. El problema desaparece – David

1

SELECT FLOOR (CAST(REPLACE([inputValue], ',', '') AS DECIMAL(24,10)))

2

Aunque no necesariamente el mejor enfoque para mi situación, yo quería salir de una solución potencial para uso futuro que descubrimos mientras investigábamos este problema.

Parece que el tipo de datos SqlServer MONEY se puede utilizar como un molde directo para cadenas con una coma que separa la parte no decimal. Entonces, donde SELECT CAST('12,345.56' AS DECIMAL(24,10)) falla, SELECT CAST('12,345.56' AS MONEY) tendrá éxito.

Una advertencia es que el tipo de datos MONEY tiene una precisión de 4 posiciones decimales y requeriría un molde explícito para obtenerlo en DECIMAL, en caso de que lo necesite.

Cuestiones relacionadas