9

Quiero escribir una función no CLR definida por el usuario en SQL Server 2005. Esta función toma una cadena de entrada y devuelve una cadena de salida. Si la cadena de entrada no es válida, entonces quiero indicar un error a la persona que llama.Error al manejar funciones definidas por el usuario

Mi primer pensamiento fue utilizar RAISERROR para generar una excepción. Sin embargo, SQL Server no permite esto dentro de una UDF (aunque puede generar excepciones en UDF basadas en CLR, vaya a la figura).

Mi último recurso sería devolver un NULL (o algún otro valor de indicador de error) de la función si el valor de entrada es erróneo. Sin embargo, no me gusta esta opción, ya que:

  1. No proporciona ninguna información útil para la persona que llama
  2. no me permite devolver un valor NULL en respuesta a una entrada válida (ya que se usa como un código de error).

¿Hay alguna manera amigable para detener una función en un error en SQL Server?

Respuesta

7

Parece que las UDF de SQL Server son un poco limitadas en esta (y muchas otras) formas.

Realmente no se puede hacer mucho al respecto, eso es (por ahora) tal como es. O bien puede definir su UDF para que pueda devolver la señal de una condición de error mediante su valor de retorno (por ejemplo, devolver NULL en caso de error) o, en su lugar, tendría que recurrir a la escritura de un procedimiento almacenado, que puede tener mucho más manejo de errores y permite RAISERROR y demás.

Así que diseñe su UDF para no requerir señalización específica de condiciones de error, o luego tiene que volver a diseñar su enfoque para usar procedimientos almacenados (que pueden tener múltiples parámetros de SALIDA y también pueden devolver el código de error junto con sus datos carga útil, si lo necesita), o código CLR administrado para sus UDF.

Lo siento, no tengo una mejor idea, por ahora, me temo que esas son sus opciones, haga su elección.

Marc

+0

Lo esperaba tanto, pero pensé en preguntar. Gracias. –

+1

El problema con los sprocs es que no puede llamarlos en línea de la forma en que lo hace con las funciones. –

+0

Estoy de acuerdo con @MikeK. La razón por la que estoy usando el UDF y no un procedimiento almacenado completo es para el uso en línea. ¿La respuesta a esta pregunta ha cambiado en las versiones más nuevas de SQL Server? (por ejemplo, 2016) – ColinMac

1

Hay una posible solución dada en una respuesta a una pregunta duplicado here, basado en esta idea:

return cast('Error message here.' as int); 

que arroja algo como esto:

Msg 245, Level 16, State 1, Line 1 
Conversion failed when converting the varchar value 'Error message here.' to data type int. 

funciona OK para UDF de valor escalar, pero no para valores de tabla.

+0

Supongo que sería posible devolver el texto de error dentro de la tabla esperada, ¿sí? – ColinMac

Cuestiones relacionadas