validar numeros isnan convertir convert sql sql-server tsql

numeros - SQL IsNumeric devuelve True pero falla la conversión de SQL Reports



isnumeric sql where (8)

Debes reemplazar la coma por un punto:

CAST(REPLACE(column, '','', ''.'') AS FLOAT)

SQL Server genera el separador decimal definido con la configuración regional, pero no incluye nada excepto un punto en CAST s a tipos numéricos.

Suponiendo los siguientes datos:

Column1 (data type: varchar(50)) -------- 11.6 -1 1,000 10" Non-Numeric String

Tengo una consulta, que está extrayendo datos de esta columna y me gustaría determinar si el valor es un número, luego lo devuelvo como tal en mi consulta. Así que estoy haciendo lo siguiente

SELECT CASE WHEN IsNumeric(Replace(Column1,''"'','''')) = 1 Then Replace(Column1,''"'','''') Else 0 End As NumericValue

SQL informa: la conversión falló al convertir el valor varchar ''11 .6 ''al tipo de datos int.

¿Por qué? También he intentado forzar a lanzar esto:

SELECT CASE WHEN IsNumeric(Replace(Column1,''"'','''')) = 1 Then cast(Replace(Column1,''"'','''') as float) Else 0 End As NumericValue

Y obtuve: Error al convertir el tipo de datos varchar a float.


Hay muchos problemas con SQL isnumeric. Por ejemplo:

select isnumeric(''1e5'')

Esto devolverá 1, pero en muchos idiomas si intenta convertirlo a un número, fallará. Un mejor enfoque es crear su propia función definida por el usuario con los parámetros que necesita verificar:

http://www.tek-tips.com/faqs.cfm?fid=6423


ISNUMERIC devuelve 1 cuando la expresión de entrada evalúa un entero válido, número de coma flotante, dinero o tipo decimal;

Entonces, el problema es que es un número válido pero no un int válido.


Kyle,

Creo que esto resuelve el problema. El problema radica en el hecho de que la cláusula ELSE inicializa el resultado para que sea INTEGER. Al hacer un encasillado explícito para FLOTAR y agregar la sugerencia de Quassnoi, parece funcionar.

DECLARE @MyTable TABLE (Column1 VARCHAR(50)) INSERT INTO @MyTable VALUES(''11.6'') INSERT INTO @MyTable VALUES(''-1'') INSERT INTO @MyTable VALUES(''1,000'') INSERT INTO @MyTable VALUES(''10" '') INSERT INTO @MyTable VALUES(''Non-Numeric String'') SELECT CASE WHEN ISNUMERIC(REPLACE(Column1,''"'','''')) = 1 THEN REPLACE(REPLACE(Column1,''"'',''''), '','', ''.'') ELSE CAST(0 AS FLOAT) END FROM @MyTable

Saludos,
Lieven


IsNumeric('' '') también devuelve 1, pero luego CAST como int. Explota. Brendan arriba dice que escribe tu propia función. Él está correcto.


Esta solución no funciona en todos los casos (específicamente números con dinero y / o separadores de miles). Concatenar una representación de exponente al final del número que está representado por una cadena ... ISNUMERIC () funciona bien desde allí. Ejemplos a continuación:

-- CURRENT ISNUMERIC RESULTS SELECT ISNUMERIC(''11.6''); --1 SELECT ISNUMERIC (''-1''); --1 SELECT ISNUMERIC(''1,000''); --1 SELECT ISNUMERIC(''10"''); --0 SELECT ISNUMERIC(''$10''); --1 -- NEW ISNUMERIC RESULTS SELECT ISNUMERIC(''11.6''+''e+00''); --1 SELECT ISNUMERIC (''-1''+''e+00''); --1 SELECT ISNUMERIC(''1,000''+''e+00''); --0 SELECT ISNUMERIC(''10"''+''e+00''); --0 SELECT ISNUMERIC(''$10''+''e+00''); --0

Esto, al menos, estandariza el formato para usar la función REPLACE ().


Acabo de conocer este problema.

Puede probar esta solución si no le importa la limitación de la longitud decimal.

CONVERT(numeric, CONVERT(money, ''.''))

NOTA:

  1. Es compatible con SQL Server 2008 o superior.
  2. El rango de dinero es: -922,337,203,685,477.5808 a 922,337,203,685,477.5807 - cuatro decimales .

Primero convierta el hilo en dinero, luego encájelo en cualquier otro formato numérico ya que el tipo de dinero da siempre una cadena numérica verdadera. Nunca verás un error entonces.

Intente lo siguiente en su consulta, y sabrá de lo que estoy hablando. Ambos devolverán 2345.5656. El tipo de datos Money se redondea a 4 lugares decimales y, por lo tanto, la conversión provoca el redondeo a 4 decimales.

SELECT CAST(''2,345.56556'' as money), CAST(''$2,345.56556'' as money)

El elenco (elenco (''2,344'' como dinero) como float) funcionará perfectamente o se emitirá (cast (''2,344'' como dinero) como decimal (7,2)) también funcionará.

Incluso el elenco (CAST (''$ 2,345.56556'' como dinero) como int) funcionará perfectamente redondeándolo al entero más cercano.