Potresti essere in grado di rilanciarlo in questo modo:
..
END TRY
BEGIN CATCH
DECLARE @errnum int;
SELECT @errnum = ERROR_NUMBER();
RAISERROR (@errnum, 16, 1);
END CATCH
Tuttavia, molto probabilmente perderai significato a causa dei segnaposto %s etc nelle righe sys.messages per ERROR_NUMBER()
Potresti fare qualcosa del genere per includere il numero e rilanciare il messaggio originale
..
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
I primi 5 caratteri sono il numero originale.
Ma se hai un codice nidificato, ti ritroverai con "00123 00456 Testo di errore".
Personalmente, mi occupo solo dei numeri di eccezione SQL per separare i miei errori (50000) dagli errori del motore (ad es. parametri mancanti) in cui il mio codice non viene eseguito.
Infine, potresti passare il valore restituito.
Ho posto una domanda su questo:Gestione degli errori di SQL Server:eccezioni e contratto database-client