2011-09-13 17 views
11

Recientemente estaba trabajando con ISNUMERIC en SQL Server, cuando encontré un problema, lo que me llevó a encontrar este fragmento de código.¿Por qué ISNUMERIC ('.') Devuelve 1?

SELECT ISNUMERIC('.') 

Esto devuelve 1, como en verdadero, ¿no debería devolver 0 como en falso?

+0

pues no. 1.1 es numérico. ISNUMERIC()) es muy básico, uno podría decir tonto ... por lo tanto, considera un período numérico. –

+2

para ese asunto ',' también funciona (muchos lugares lo usan como divisor decimal) – Unsliced

Respuesta

16

Ver IsNumeric() Broken? Only up to a point.

SELECT CAST('.' AS MONEY) 

rendimientos 0.00 (aunque el reparto falla por int y float)

ISNUMERIC simplemente comprueba que el valor se puede lanzar con una cualquiera de los tipos de datos numéricos, que es generalmente inútil. Por lo general, desea saber si se puede convertir a un tipo específico.

Additionally it doesn't even seem to do that task correctly for all possible inputs.. ISNUMERIC(' ') devuelve 0 a pesar de lanzar correctamente tanto a int como a dinero. Por el contrario ISNUMERIC(N'8') devuelve 1 pero no se lanza con éxito a nada de lo que probé.

Algunas funciones de ayuda útiles para eso están aquí IsNumeric, IsInt, IsNumber.

SQL Server 2012 introdujo TRY_PARSE y TRY_CONVERT que ayudan con esto en gran medida.

+3

exactamente. Considere la pendiente resbaladiza: '10' está bien,' 10.0' está bien, '10.' está bien ... (_comienzo para deslizar_) así' .1' debería estar bien ... y '.0' y .. . Sí '.' también está bien. [Ser generoso con el análisis de entrada] (https://plus.google.com/114034641416688387662/posts/8bJZnLFxAfi) tiene algunas desventajas. – sehe

+0

¡Gracias por eso, rueda en Denali! –

1

Porque "." ¡se usa en un número decimal!

ver here

IsNumeric por '-' & ''. ¿Por qué isnumeric ('-') & isnumeric ('.') Que devuelve 1?

Respuesta: Porque "-" significa negativo y "." se usa en un número decimal . No tengo idea de por qué lo llamaron ISNUMÉRICO sin embargo. Ellos deberían haberlo nombrado, SIN NUMBERRELATED.