Convierta valores numéricos de cadena con coma como separador decimal a NUMERIC (10, 2)


12

Tengo una tabla SQL de columnas varchar que contienen números con formato griego (.como separador de miles y coma como separador decimal)

La conversión clásica

CONVERT(numeric(10,2),REPLACE([value],',','.'))

no funciona porque el. (separador de miles) mata la conversión

Por ejemplo, intente

CONVERT(numeric(10,2),REPLACE('7.000,45',',','.'))

Quiero convertir dichos valores a numéricos (10,2)

¿Alguna sugerencia de cómo manejarlo?

Respuestas:


10

( Si está utilizando SQL Server 2012 o más reciente, consulte la respuesta de @ wBob para un enfoque más limpio. El enfoque descrito en mi respuesta a continuación solo es necesario si está utilizando SQL Server 2008 R2 o anterior ) .

No necesita (o desea) el separador de miles cuando realiza la conversión NUMERIC, independientemente de si se trata de una coma, un punto o un espacio, por lo que debe deshacerse de ellos primero. Luego convierta la coma en un punto / decimal y listo:

SELECT CONVERT(NUMERIC(10, 2), 
               REPLACE(
                       REPLACE('7.000,45', '.', ''),
                       ',', '.'
                      )
              ) AS [Converted];

Devoluciones:

7000.45

En aras de la exhaustividad, debo mencionar que también probé:

  • SET LANGUAGE Greek;

  • Mirando varios estilos de formato para CONVERTIR , pero nada se aplica aquí.

  • La función FORMATO , pero el tipo de entrada debe ser un valor numérico o de fecha / hora / fecha y hora (eso y se introdujo en SQL Server 2012, por lo que no es aplicable a SQL Server 2008 R2 o anterior).

Y nada más parecía funcionar. Esperaba encontrar algo más elegante que dos REPLACEllamadas, pero hasta ahora no tuve tanta suerte.


Además, solo por mencionar que, aunque no es una solución T-SQL pura, esto también se puede lograr a través de SQLCLR. Y, hay una función pre-hecha que hace esto en la biblioteca SQL # (que escribí) llamada String_ TryParseToDecimal . Esta función está disponible en la versión gratuita y funciona en todas las versiones de SQL Server a partir de SQL Server 2005:

SELECT SQL#.String_TryParseToDecimal('7.000,45', 'el-GR');

Devoluciones:

7000.45000000000000000000

10

¿Qué versión de SQL Server estás usando? Desde SQL Server 2012 en adelante, puede usar TRY_PARSE con su USING cultureargumento. También puede usar PARSE , ya que la diferencia PARSEfallará si falla la conversión y TRY_PARSEdevolverá un NULL, p. Ej.

DECLARE @t TABLE ( x VARCHAR(10) )

INSERT INTO @t
VALUES ( '7.000,45' ), ( 'xxx' )

SELECT x, 
    TRY_PARSE( x AS NUMERIC(10,2) USING 'El-GR' ) x
FROM @t

resultados de la prueba

HTH


1
Acabo de agregar una nota en la parte superior de mi respuesta, dirigiendo a los lectores aquí si están utilizando SQL Server 2012 o posterior.
Solomon Rutzky

0

El siguiente código funcionó en mi caso:

select convert(varchar,FORMAT(123456789.0258,'###,###,###.00','de-de'))

salida: 123.456.789,03


o seleccione convertir (varchar, FORMAT (cast (yourValue as numeric (10,2)), '###, ###, ###. 00', 'de-de'))
Shahed Adnan

2
parece que está respondiendo el problema inverso de lo que preguntó el OP. no quieren formatear valores numéricos, quieren convertir valores varchar formateados a numéricos.
ypercubeᵀᴹ

1
Además, dos notas: 1) siempre se especifica una longitud de VARCHAR, NVARCHAR, CHAR, y NCHARtipos. El valor predeterminado es 30 en algunos casos y 1 en otros casos, lo que genera un código que no se puede mantener / propenso a errores. 2) no necesita el diseño exacto cuando lo usa #. Solo necesita uno de ellos (por ejemplo #) para todos los dígitos pero sin separador de miles, o dos de ellos separados por una coma (por ejemplo #,#) para obtener todos los dígitos y el separador de miles. Por lo tanto, SELECT CONVERT(VARCHAR(20), FORMAT(123456789.0258, N'#,#.00', N'de'));devuelve el mismo resultado que lo que sugiere.
Solomon Rutzky
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.