Pregunta

Tengo una base de datos SQL Server 2000 con una columna de tipo Varchar (255). Todos los datos son datos nulos o numéricos con hasta dos puntos de precisión (por ejemplo, '11 .85 '). Intenté ejecutar la siguiente consulta T-SQL pero recibí el error 'Error al convertir el tipo de datos VARCHAR a Numeric'

SELECT CAST([MyColumn] AS DECIMAL)
FROM [MyTable];

Probé un elenco más específico, que también falló.

SELECT CAST([MyColumn] AS DECIMAL(6,2))
FROM [MyTable];

También intenté lo siguiente para ver si algún dato no es numérico, y los únicos valores devueltos fueron nulos.

SELECT ISNUMERIC([MyColumn]), [MyColumn]
FROM [MyTable]
WHERE ISNUMERIC([MyColumn]) = 0;

Traté de convertir a otros tipos de datos, como flotador y dinero, pero solo el dinero fue exitoso. Entonces probé lo siguiente:

SELECT CAST(CAST([MyColumn] AS MONEY) AS DECIMAL)
FROM [MyTable];

... que funcionó bien. ¿Alguna idea por qué falló la consulta original? ¿Habrá un problema si primero me convierto en dinero y luego a decimal?

¡Gracias!

¿Fue útil?

Solución

Es probable que esto dependa de si el símbolo decimal es una coma o un punto. Aquí hay algunas consultas de prueba y sus resultados:

select CAST('3.6' as decimal) -- 3.60
select CAST('3,6' as decimal) -- Error converting data type varchar to numeric.
select CAST('3.6' as money) -- 3.60
select CAST('3,6' as money) -- 36.00 (!)
select ISNUMERIC('3.6') -- 1
select ISNUMERIC('3,6') -- 1

La documentación para Esnumérico dice :

ISNUMERIC Devuelve 1 cuando la expresión de entrada se evalúa a un entero válido, número de punto flotante, dinero o tipo decimal; de lo contrario devuelve 0

Ambas cosas 3.6 y 3,6 puede ser elegido para money, asi que es por eso isnumeric('3,6') devoluciones 1.

Para resolver este problema, reemplace las comas con puntos (o viceversa, si su sistema usa coma como símbolo decimal):

select cast(replace('3,6',',','.') as decimal)

Otra opción es cambiar el "símbolo decimal" en Windows. Está en el panel de configuración -> regional y lenguaje -> formatos -> configuración adicional -> números.

Otros consejos

Otra causa son las cuerdas vacías. Por ejemplo, si utiliza el Asistente de importación para importar un archivo CSV, los campos vacíos se convertirán en cadenas vacías, no nulas.

Este es un idioma común para solucionar esto:

CAST(NULLIF([number_as_a_string],'') AS decimal(13,2))

Seleccione Cast (IsNull (MyColumn, 0) como decimal (4,2)) de [MyTable];

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top