I think I worked something out. Thoughts anyone?Call with: exec dbo.usp_test1
Sample script:if object_id('dbo.usp_test1') is not null drop procedure dbo.usp_test1if object_id('dbo.usp_test2') is not null drop procedure dbo.usp_test2if object_id('dbo.usp_test3') is not null drop procedure dbo.usp_test3gocreate procedure dbo.usp_test1asdeclare @errorseverity int, @errorstate int, @returncode int;declare @stacktrace nvarchar(max);declare @procedure_name sysname; set @procedure_name = OBJECT_NAME(@@PROCID);begin try exec @returncode = dba.dbo.usp_test2 if (@returncode != 0) raiserror('failed to execute procedure ''%s''.', 15, 1, @procedure_name);end trybegin catch set @errorseverity = error_severity(); set @errorstate = error_state(); set @stacktrace = 'Error ' + cast(error_number() as varchar) + ' generated in procedure ' + error_procedure() + ' on line ' + cast(error_line() as varchar) + ' while executing procedure ' + @procedure_name + '.' + char(13) + char(10) + error_message(); raiserror(@stacktrace, @errorseverity, @errorstate);end catchgocreate procedure dbo.usp_test2asdeclare @errorseverity int, @errorstate int, @returncode int;declare @stacktrace nvarchar(max);declare @procedure_name sysname; set @procedure_name = OBJECT_NAME(@@PROCID);begin try exec @returncode = dba.dbo.usp_test3 if (@returncode != 0) raiserror('failed to execute procedure ''%s''.', 15, 1, @procedure_name);end trybegin catch set @errorseverity = error_severity(); set @errorstate = error_state(); set @stacktrace = 'Error ' + cast(error_number() as varchar) + ' generated in procedure ' + error_procedure() + ' on line ' + cast(error_line() as varchar) + ' while executing procedure ' + @procedure_name + '.' + char(13) + char(10) + error_message(); raiserror(@stacktrace, @errorseverity, @errorstate);end catchgocreate procedure dbo.usp_test3asdeclare @errorseverity int, @errorstate int, @returncode int;declare @stacktrace nvarchar(max);declare @procedure_name sysname; set @procedure_name = OBJECT_NAME(@@PROCID);begin try raiserror('this is a test error', 15, 1)end trybegin catch set @errorseverity = error_severity(); set @errorstate = error_state(); set @stacktrace = 'Error ' + cast(error_number() as varchar) + ' generated in procedure ' + error_procedure() + ' on line ' + cast(error_line() as varchar) + ' while executing procedure ' + @procedure_name + '.' + char(13) + char(10) + error_message(); raiserror(@stacktrace, @errorseverity, @errorstate);end catchgoGenerates:Msg 50000, Level 15, State 1, Procedure usp_test1, Line 22Error 50000 generated in procedure usp_test2 on line 22 while executing procedure usp_test1.Error 50000 generated in procedure usp_test3 on line 20 while executing procedure usp_test2.Error 50000 generated in procedure usp_test3 on line 9 while executing procedure usp_test3.this is a test error
I think this works fine for producing a readable callstack back to the caller.