поэтому я создал это (я использовал некоторые вещи, найденные на другом веб-сайте) для обработки транзакций и наличия своего рода трассировки стека при выполнении хранимой процедуры, которая может вызывать другие хранимые процедуры, требующие транзакции и т. Д.
так что если у меня A звонит B и B звонит C и C получил ошибку Я могу правильно откатить мои вещи и вернуть стековую трассировку, говорящую: ошибка в C следуйте трассировке, чтобы выяснить, где / как / и т.д ...
Кто-нибудь из вас обнаружил проблему с этой логикой?
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[NAME]
AS
BEGIN
SET NOCOUNT ON
SET XACT_ABORT ON
declare @trancount int
set @trancount = @@trancount
declare @savePointName varchar(40)
set @savePointName = newid()
BEGIN TRY
if @trancount = 0
begin transaction
else
save transaction @savePointName
/*
// STUFF HERE
*/
if @trancount = 0
commit transaction
END TRY
BEGIN CATCH
declare @xstate int
set @xstate = XACT_STATE()
if @xstate = -1 and @trancount = 0
rollback transaction
if @xstate = 1 and @trancount = 0
rollback transaction
if @xstate = 1 and @trancount > 0
rollback transaction @savePointName
declare @message varchar(max)
set @message = ERROR_MESSAGE() +
' (' + ERROR_PROCEDURE() +
':' + ltrim(str(ERROR_LINE())) +
', Raised ' + ltrim(str(ERROR_NUMBER())) +
', Severity ' + ltrim(str(ERROR_SEVERITY())) +
', State ' + ltrim(str(ERROR_STATE())) + ')'
RAISERROR(@message,16,1)
END CATCH
END