Vous pourrez peut-être le relancer comme ceci :
..
END TRY
BEGIN CATCH
DECLARE @errnum int;
SELECT @errnum = ERROR_NUMBER();
RAISERROR (@errnum, 16, 1);
END CATCH
Cependant, vous perdez très probablement une perte de sens à cause des espaces réservés %s etc. dans les lignes sys.messages pour ERROR_NUMBER()
Vous pouvez faire quelque chose comme ça pour inclure le numéro et renvoyer le message d'origine
..
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
Les 5 premiers caractères sont le numéro d'origine.
Mais si vous avez du code imbriqué, vous vous retrouverez avec "00123 00456 Texte d'erreur".
Personnellement, je ne traite que les numéros d'exception SQL pour séparer mes erreurs (50000) des erreurs de moteur (par exemple, des paramètres manquants) où mon code ne s'exécute pas.
Enfin, vous pouvez lui transmettre la valeur de retour.
J'ai posé une question à ce sujet :Gestion des erreurs SQL Server :exceptions et contrat client-base de données