Es posible que pueda volver a lanzarlo así:
..
END TRY
BEGIN CATCH
DECLARE @errnum int;
SELECT @errnum = ERROR_NUMBER();
RAISERROR (@errnum, 16, 1);
END CATCH
Sin embargo, lo más probable es que pierda el significado debido a los marcadores de posición %s, etc. en las filas de sys.messages para ERROR_NUMBER()
Podría hacer algo como esto para incluir el número y volver a enviar el mensaje original
..
END TRY
BEGIN CATCH
DECLARE @errnum nchar(5), @errmsg nvarchar(2048);
SELECT
@errnum = RIGHT('00000' + ERROR_NUMBER(), 5),
@errmsg = @errnum + ' ' + ERROR_MESSAGE();
RAISERROR (@errmsg, 16, 1);
END CATCH
Los primeros 5 caracteres son el número original.
Pero si tiene un código anidado, terminará con "00123 00456 Texto de error".
Personalmente, solo trato con números de excepción de SQL para separar mis errores (50000) de los errores del motor (por ejemplo, parámetros faltantes) donde mi código no se ejecuta.
Finalmente, podría pasarle el valor devuelto.
Hice una pregunta sobre esto:Manejo de errores de SQL Server:excepciones y el contrato base de datos-cliente