Estoy usando RAISERROR()
para proporcionar algunas funciones básicas de Prueba de Unidad (como aquí ), pero estoy frustrado por la incapacidad de usar FLOATs
en el mensaje de error. Sé que puedo convertir el flotante en una cadena, pero lo estoy usando RAISERROR
en cada prueba de unidad individual, no quiero agregar otra línea de código para cada prueba. (¡Mis pruebas unitarias ya son lo suficientemente detalladas!) ¿Hay alguna forma de realizar una conversión / conversión en línea dentro de la RAISERROR
lista de parámetros? ¿O hay otra forma de evitar esta deficiencia?
Actualización: Entonces, en última instancia, lo que desearía poder hacer es esto:
RAISERROR('Unit Test FAILED! %f', 11, 0, @floatParm)
Desafortunadamente, RAISERROR
no maneja% f o flota en general. Entonces tengo que hacer esto en su lugar:
DECLARE @str VARCHAR(40) = CAST(@floatParm AS VARCHAR(40))
RAISERROR('Unit Test FAILED! %s', 11, 0, @str)
... que parece un desastre cuando se dispersa a través de docenas de pruebas unitarias. Así que me gustaría resumirlo en algo como esto:
RAISERROR('Unit Test FAILED! %s', 11, 0, CAST(@floatParm AS VARCHAR(40))
Pero eso me da un Incorrect syntax near 'CAST'
mensaje. No entiendo por qué eso es ilegal, pero lo es. ¿Hay otro "un revestimiento" que podría usar aquí?
fuente
Respuestas:
Desafortunadamente, por cualquier razón, no puede hacer una conversión en línea en ese contexto, y
RAISERROR
no admite directamentefloat
, de nuevo, por cualquier razón.Para completar esta respuesta, aquí está el fragmento relevante de MSDN , que estoy seguro de que ya has visto (nota: es el mismo texto en todas las versiones de la documentación de 2005 a 2012):
La única solución razonable que se me ocurre sería escribir un procedimiento almacenado para finalizar la
RAISERROR
llamada. Aquí hay un punto de partida:Lamentablemente, no hay una manera fácil de escalar esto para un número arbitrario de parámetros ... Probablemente podría hacerse usando SQL dinámico anidado enrevesado, lo que sería divertido de depurar. Lo dejaré como ejercicio para el lector.
He utilizado
sql_variant
en el supuesto de que, por razones de uniformidad de código, el mismo procedimiento se utiliza en todas partes, incluso para los tipos de valores que están soportados directamente porRAISERROR
. Además, esto podría crearse como un procedimiento almacenado temporal si es apropiado.Así es como se vería este procedimiento:
Salida:
Por lo tanto, el resultado neto es que no obtienes la capacidad de formateo de flotantes (tira la tuya propia), pero sí obtienes la capacidad de generarlos (¡decimal / numérico también!) Mientras conservas la capacidad de formateo para los otros tipos.
fuente
sql_variant
, así que me quedé atrapado en la lista de argumentos y asumí que no era posible. Me has enseñado algo muy útil hoy. ¡Muchas gracias!