Du kanske kan kasta om det så här:
..
END TRY
BEGIN CATCH
DECLARE @errnum int;
SELECT @errnum = ERROR_NUMBER();
RAISERROR (@errnum, 16, 1);
END CATCH
Men du förlorar sannolikt en förlorad mening på grund av %s etc platshållare i sys.messages-raderna för ERROR_NUMBER()
Du kan göra något så här för att inkludera numret och skicka tillbaka det ursprungliga meddelandet
..
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
De första 5 tecknen är det ursprungliga numret.
Men om du har kapslad kod kommer du att sluta med "00123 00456 Error text".
Personligen sysslar jag bara med SQL Exception-nummer för att skilja mina fel (50000) från motorfel (t.ex. saknade parametrar) där min kod inte körs.
Slutligen kan du skicka ut returvärdet.
Jag ställde en fråga om detta:SQL Server-felhantering:undantag och databas-klientkontraktet