I'm facing an incredibly puzzling situation, we have a recently updated SQL Server from 2016 to 2019, on which a stored procedure usually called from a python script after some data integration, now fails with an error.
"[25000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Cannot roll back TR_NL. No transaction or savepoint of that name was found. (6401)
The stored procedure itself follows a quite standard TRY/CATCH structure
USE [MYBASE]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[p_myproc]
@error NVARCHAR(MAX)= 'Success' OUTPUT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @idMarche;
DECLARE @TranName VARCHAR(20);
IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'SOME_TABLE')
BEGIN
SELECT @TranName = 'TR_NL';
BEGIN TRANSACTION @TranName;
BEGIN TRY
/*
Bunch of updates, inserts etc. Some of which conditionals with nested IF BEGIN END etc.
*/
END TRY
BEGIN CATCH
SELECT @error ='Error Number: ' + ISNULL(CAST(ERROR_NUMBER() AS VARCHAR(10)), 'NA') + '; ' + Char(10) +
'Error Severity ' + ISNULL(CAST(ERROR_SEVERITY() AS VARCHAR(10)), 'NA') + '; ' + Char(10) +
'Error State ' + ISNULL(CAST(ERROR_STATE() AS VARCHAR(10)), 'NA') + '; ' + Char(10) +
'Error Line ' + ISNULL(CAST(ERROR_LINE() AS VARCHAR(10)), 'NA') + '; ' + Char(10) +
'Error Message ' + ISNULL(ERROR_MESSAGE(), 'NA')
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION @TranName;
END CATCH
IF @@TRANCOUNT > 0
COMMIT TRANSACTION @TranName;
END
/*
A few more similar blocks of conditional transactions
*/
IF @error = 'Success' OR @error IS NULL
BEGIN
/*
Drop some tables
*/
END
END
Following call works perfectly well in SSMS but fails with said error when sent from my python script
SET NOCOUNT ON;
DECLARE @return_value INTEGER;
DECLARE @error NVARCHAR(MAX);
EXEC @return_value = [dbo].[p_myproc] @error = @error OUTPUT;
SELECT @error AS erreur, @return_value AS retour;