Al intentar validar un GUID proporcionado por el usuario dentro de un procedimiento almacenado, se utilizó un enfoque simple; tomar la entrada del usuario como un CHAR (36) y luego CAST explícitamente como UNIQUEIDENTIFIER dentro de TRY CATCH. El CATCH luego burbujea el error con una descripción de error personalizada usando un RAISERROR.gestión de errores de tsqlt que supera el controlador de errores de procedimiento almacenado (unidad)
Ejecutando el procedimiento almacenado manualmente, todo funciona como se espera y se produce un error.
Crea una prueba tSQLt para llamar a la unidad (el procedimiento con validación de GUID) y manejar el error que se produce y comparar con el error esperado continuamente falla con un error de transacción; tSQLt ha detectado un error y se maneja dentro del marco tSQLt.
Esto me sugiere que tSQLt está manejando la severidad de un error al CASTAR a un tipo de datos diferente y está impidiendo que TRY/CATCH dentro del procedimiento almacenado lo maneje. Al igual que los procedimientos anidados, a veces ignoran el TRY/CATCH dentro del procedimiento secundario y se repiten hasta el procedimiento principal; ejemplo que es si el niño proc. hace referencia a una tabla que no existe.
¿Alguien ha tenido un problema similar? Simplemente para validar mi línea de pensamiento actual.
He eliminado la prueba y está siendo probado en otro lugar, pero esto me ha causado un "agujero" en mi unidad DB.
Finalmente, creo que debería mencionar que sé que puedo realizar una validación diferente en un parámetro CHAR suministrado, que no sea CAST, y generar un error de esa manera, pero esta es una consulta tSQLt y no una consulta tSQL.
EDITAR
Ejemplo del código:
@sGUID es un CHAR (36) y es un parámetro pasado al procedimiento.
BEGIN TRY
SELECT CAST(@sGUID AS UNIQUEIDENTIFIER)
END TRY
BEGIN CATCH
RAISERROR('Invalid GUID format',16,1)
END CATCH
La línea SELECT no desencadena la captura tSQLt parece intervenir antes de mano y lanza el error de transacción ROLLBACK.
¿Está utilizando alguna transacción en sus procedimientos almacenados? ¿Puedes publicar un código de muestra? – podiluska
No hay transacciones en el procedimiento – Luminary
¿Ha verificado que @sGUID tiene un formato de GUID válido establecido para el valor? En otras palabras, una cadena de 36 dígitos que consta únicamente de valores hexadecimales. – Alexander