2011-09-23 11 views
5
declare @input varchar(255) = 'abc' 

select * from table where id = CAST(@input as int) 

¿Puedo hacer esto para que la conversión falle silenciosamente, o de forma predeterminada a algún valor proporcionado por el usuario (o valor predeterminado del sistema)?Servidor SQL arrojar cadena de seguridad y fallar silenciosamente

+0

La asignación inicial fallará. ¿Querías usar otro tipo de datos? –

+0

jaja sí, gracias por la captura. Actualicé la pregunta en consecuencia –

Respuesta

12

Denali tiene try_convert y try_parse funciones.

Hasta entonces puedes usar

DECLARE @input VARCHAR(11) = 'abc' 

SELECT * 
FROM table 
WHERE id = CAST(CASE WHEN @input NOT LIKE '%[^0-9]%' THEN @input END AS INT) 

Es posible que tenga que ajustar la prueba un poco (por ejemplo, que no permite enteros negativos y permite que los positivos más grandes que el máximo int), pero si encuentra un ensayo adecuado (e.g. the one here) y utilice una declaración CASE, debe evitar cualquier error de fundición, ya que el orden de evaluación de CASE es mostly garantizado.

+1

+1 Buena respuesta - las cubiertas decimales también (estaba intentando la función ISNUMERIC) –

+0

funcionó muy bien, ¡gracias! –

+0

@Stormer: su [sugerencia de edición] (http://stackoverflow.com/review/suggested-edits/5757328) no funciona. Simplemente comprobaría que una cadena contiene al menos un número. No * solo * números. –

1

Puede poner su selección en el bloque TRY-CATCH y volver a emitir la consulta en CATCH con el valor predeterminado.

Cuestiones relacionadas