Click here to Skip to main content
15,887,414 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
See more:
I'm building an store procedure to read an XML document type from a secondary XMLTable. But when running the SP or even the query by itself I get the following message:

"The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION."

The code I'm using is as follows:

--/****** Object:  StoredProcedure [dbo].[ImportXMLData]    Script Date: 2/8/2018 1:01:51 AM ******/
--SET ANSI_NULLS ON
--GO

--SET QUOTED_IDENTIFIER ON
--GO





--CREATE proc [dbo].[ImportXMLData]

--as


DECLARE @lastid as INT
DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX)
DECLARE @FileName varchar(500)
DECLARE @LoadedDateTime datetime
DECLARE @Id int

BEGIN

DECLARE Cursor01 CURSOR FOR   
SELECT ID, XMLData, LoadedDateTime, FileName
FROM XMLTable 
WHERE DataImported IS NULL  
ORDER BY ID
--SELECT @XML = XMLData, @FileName = FileName FROM XMLTable


OPEN Cursor01  

FETCH NEXT FROM Cursor01   
INTO @Id, @XML, @LoadedDateTime, @FileName

WHILE @@FETCH_STATUS = 0  
	BEGIN
		begin try

			EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML,'<cfdi:Comprobante xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:implocal="http://www.sat.gob.mx/implocal" xmlns:Emisor="http://www.w3.org/2001/XMLSchema" xmlns:Receptor="http://www.w3.org/2001/XMLSchema" />'

			insert into InvoiceImport(ImportDateTime,Folio,Fecha,FormaPago,NoCertificado,Total,Moneda,MetodoPago,RFCEmisor,NombreEmisor,RFCReceptor,NombreReceptor,TotalImpuestosTrasladados,SubTotal,UUID,FechaTimbrado,Impuesto,Tasa,ImporteImpuesto,UsoCFDI,Serie,FileName)
			select @LoadedDateTime,Folio,Fecha,FormaPago,NoCertificado,Total,Moneda,MetodoPago,RFCEmisor,NombreEmisor,RFCReceptor,NombreReceptor,TotalImpuestosTrasladados,SubTotal,UUID,FechaTimbrado,Impuesto,Tasa,ImporteImpuesto,UsoCFDI,Serie,@FileName FROM OPENXML (@hdoc,'/cfdi:Comprobante',2)

			WITH ( 
			[Folio] VARCHAR(10) '/cfdi:Comprobante/@FOLIO',
			[Serie] VARCHAR(10) '/cfdi:Comprobante/@SERIE',
			[Fecha] Datetime '/cfdi:Comprobante/@FECHA',
			[FormaPago]varchar(4) '/cfdi:Comprobante/@FORMAPAGO',
			[NoCertificado]varchar(50) '/cfdi:Comprobante/@NOCERTIFICADO',
			[Total]float '/cfdi:Comprobante/@TOTAL',
			[Moneda]varchar(4) '/cfdi:Comprobante/@MONEDA',
			[MetodoPago]varchar(4) '/cfdi:Comprobante/@METODOPAGO',
			[RFCEmisor]VARCHAR(25) './cfdi:Emisor/@RFC',
			[NombreEmisor]VARCHAR(50) './cfdi:Emisor/@NOMBRE',
			[RFCReceptor]VARCHAR(25) './cfdi:Receptor/@RFC',
			[NombreReceptor]VARCHAR(50) './cfdi:Receptor/@NOMBRE',
			[TotalImpuestosTrasladados]float './cfdi:IMPUESTOS/@TOTALIMPUESTOSTRASLADADOS',
			[UUID] varchar(100) './cfdi:Complemento//@UUID',
			[FechaTimbrado] datetime './cfdi:Complemento//@FECHATIMBRADO',
			[SubTotal] float '/cfdi:Comprobante/@SUBTOTAL',
			[Impuesto] float './cfdi:IMPUESTOS//@IMPUESTO',
			[Tasa] float './cfdi:IMPUESTOS//@TASA',
			[ImporteImpuesto] float './cfdi:IMPUESTOS//@IMPORTE',
			[UsoCFDI]VARCHAR(5)'./cfdi:Receptor/@USOCFDI')

			UPDATE XMLTable
			SET DataImported = 1
			WHERE @FileName = FileName AND XMLTable.DataImported IS NULL


		end try

	begin catch
		
		if(@@trancount>0)
		print 'error ocuured'
		ROLLBACK

	end catch
	FETCH NEXT FROM Cursor01   
	INTO @Id, @XML, @LoadedDateTime, @FileName

	END

CLOSE Cursor01
DEALLOCATE Cursor01
END
GO


What I have tried:

BEGIN TRAN
COMMIT TRAN
Using less columns in the insert to
Posted
Updated 7-Feb-18 20:30pm

Look at the error message:
The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION
It couldn't be more specific!
Your ROLLBACK in your Catch block has no BEGIN TRANS - there is no transaction there at all, except the ROLLBACK, you have no COMMIT either!

To roll back a transaction, you have to begin a transaction, do the updates to the DB, and commit it when it works or roll it back when it doesn't.
 
Share this answer
 
BEGIN TRY
    BEGIN TRAN

   EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML,'<cfdi:Comprobante xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:implocal="http://www.sat.gob.mx/implocal" xmlns:Emisor="http://www.w3.org/2001/XMLSchema" xmlns:Receptor="http://www.w3.org/2001/XMLSchema" />'

INERT INTO InvoiceImport(
  ImportDateTime,Folio,Fecha,FormaPago,NoCertificado,Total,Moneda,MetodoPago,RFCEmisor,
  NombreEmisor,RFCReceptor,NombreReceptor,TotalImpuestosTrasladados,SubTotal,UUID,
  FechaTimbrado,Impuesto,Tasa,ImporteImpuesto,UsoCFDI,Serie,FileName
                         )
			  SELECT @LoadedDateTime,Folio,Fecha,FormaPago,NoCertificado,Total,Moneda,MetodoPago,RFCEmisor,
NombreEmisor,RFCReceptor,NombreReceptor,TotalImpuestosTrasladados,SubTotal,UUID,
FechaTimbrado,Impuesto,Tasa,ImporteImpuesto,UsoCFDI,Serie,@FileName
      FROM OPENXML (@hdoc,'/cfdi:Comprobante',2)

			WITH ( 
			[Folio] VARCHAR(10) '/cfdi:Comprobante/@FOLIO',
			[Serie] VARCHAR(10) '/cfdi:Comprobante/@SERIE',
			[Fecha] Datetime '/cfdi:Comprobante/@FECHA',
			[FormaPago]varchar(4) '/cfdi:Comprobante/@FORMAPAGO',
			[NoCertificado]varchar(50) '/cfdi:Comprobante/@NOCERTIFICADO',
			[Total]float '/cfdi:Comprobante/@TOTAL',
			[Moneda]varchar(4) '/cfdi:Comprobante/@MONEDA',
			[MetodoPago]varchar(4) '/cfdi:Comprobante/@METODOPAGO',
			[RFCEmisor]VARCHAR(25) './cfdi:Emisor/@RFC',
			[NombreEmisor]VARCHAR(50) './cfdi:Emisor/@NOMBRE',
			[RFCReceptor]VARCHAR(25) './cfdi:Receptor/@RFC',
			[NombreReceptor]VARCHAR(50) './cfdi:Receptor/@NOMBRE',
			[TotalImpuestosTrasladados]float './cfdi:IMPUESTOS/@TOTALIMPUESTOSTRASLADADOS',
			[UUID] varchar(100) './cfdi:Complemento//@UUID',
			[FechaTimbrado] datetime './cfdi:Complemento//@FECHATIMBRADO',
			[SubTotal] float '/cfdi:Comprobante/@SUBTOTAL',
			[Impuesto] float './cfdi:IMPUESTOS//@IMPUESTO',
			[Tasa] float './cfdi:IMPUESTOS//@TASA',
			[ImporteImpuesto] float './cfdi:IMPUESTOS//@IMPORTE',
			[UsoCFDI]VARCHAR(5)'./cfdi:Receptor/@USOCFDI')

			UPDATE XMLTable
			SET DataImported = 1
			WHERE @FileName = FileName AND XMLTable.DataImported IS NULL

            COMMIT TRAN;
		END TRY

	BEGIN CATCH
		
		IF(@@trancount<>0)
		print 'error ocuured'
		ROLLBACK TRAN;

	END CATCH
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900