Esto será por defecto no numéricos a 0 y no requerirá otra declaración:
SELECT CASE
WHEN ISNUMERIC(myvarcharcolumn)=1 THEN
CONVERT(float, REPLACE(LTRIM(RTRIM(myvarcharcolumn)), ',', '.'))
ELSE 0 END AS myfloatcolumn
La llamada a la función replace() se utiliza para cambiar comas para periodos. Las comas se utilizan en algunas culturas como un separador decimal (por ejemplo, "1,25" en lugar de "1,25"), pero a menos que su servidor esté configurado con una de esas como cultura predeterminada, ISNUMERIC() devolverá 1 pero CONVERTIR () lanzará un error. Esto hace significa que sus cadenas no deben usar comas como separadores de miles, pero en la mayoría de los casos, una coma para un marcador de posición decimal es más probable que sea un marcador de posición decimal.
La llamada LTRIM (RTRIM()) se debe a que ISNUMERIC() devolverá 1 para una cadena con espacios iniciales o finales, pero CONVERT() no puede tratar con ellos. Entonces, debes recortar tus cadenas.
El único problema potencial restante es que ISNUMERIC() devolverá 1 si el número se puede representar como int, currency, decimal o float, pero solo se está convirtiendo en un flotante. De manera realista, un flotador puede almacenar casi cualquier cosa que le arroje, pero si intentara convertirlo a int, ISNUMERIC() devolvería 1 para un valor como "2.5", pero CONVERT (int, '2.5') aún lanzar un error.
TRY CATCH no encaja en mi solución ya que estoy limitado y no puedo agregar declaraciones adicionales. Considero agregar funciones adicionales que harán el casting de forma segura.Algo así como, "myconvert (tipo, datos, valor predeterminado)", me pregunto si hay otra manera que me libre de agregar funciones personalizadas en la base de datos. – AndrewG
+1 por TRY..CATCH - ¡ese es realmente el camino a seguir! –
"SELECCIONAR CASO" en la respuesta a continuación es mejor y más flexible que TRY ... CATCH. – TamusJRoyce