La función ISNUMERIC() de Microsoft SQL Server determina si una expresión es numérica o no lo es:

https://docs.microsoft.com/es-es/sql/t-sql/functions/isnumeric-transact-sql?view=sql-server-2017

A priori, parece una funcionalidad bastante sencilla que he necesitado hace poco, pero haciendo unas pruebas bastante básicas con esta función, descubrí que su funcionamiento no era el que me esperaba:

Le estaba pasando a la función una serie de números concatenados por comas y me llevé una sorpresa al darme cuenta de que la cadena "12,21,23,27" estaba siendo evaluada como si fuese un número...

Volví a leer la documentación de la función y vi que señalaban en una nota que con algunos caracteres como el "+" o el "-" la función no se comportaba correctamente, lo cual me volvió a sorprender porque tampoco es que parezca que la función sea demasiado compleja. En esa misma nota enlazaban con una página en la que aparecía un listado de caracteres, en el cual no se indicaba nada de la ",".

Buceando un poco por internet encontré la siguiente referencia: http://www.sqlservercentral.com/articles/ISNUMERIC()/71512/

De donde se puede extraer la siguiente sentencia, que ilustra que devolverá ISNUMERIC() para cada una.

--===== Return all characters that ISNUMERIC thinks is numeric
     -- (uses values 0-255 from the undocumented spt_Values table
     -- instead of a loop from 0-255)
 SELECT [Ascii Code]        = STR(Number),
        [Ascii Character]   = CHAR(Number),
        [ISNUMERIC Returns] = ISNUMERIC(CHAR(Number))
   FROM Master.dbo.spt_Values
  WHERE Type = 'P'
    AND Number BETWEEN 0 AND 255
    AND ISNUMERIC(CHAR(Number)) = 1

El código ASCII que representa la coma es el 44 y según esto, ISNUMERIC() determinará que la coma "," es un carácter numérico. Con los puntos (carácter número 46) sí parece que se comporta correctamente:

Así que viendo esto concluí que, en mi caso, no iba a poder hacer uso de la función ISNUMERIC() porque no me parecía muy fiable... Buscando otras alternativas a ella podemos encontrar, por ejemplo:

Uso de patrones con caracteres comodín:

Uso de TRY_CONVERT:


Conclusión: Es necesaria mucha precaución si se va a utilizar la función ISNUMERIC() en cadenas en las que pueden aparecer ciertos símbolos, ya que con algunos símbolos la función parece que no funciona bien o, al menos, no tiene el comportamiento que cabría esperar.

Si no estamos seguros del tipo de cadena que nos van a pasar, será mejor utilizar una de las alternativas propuestas, u otras que se os ocurran, para no obtener resultados erróneos.