Member 13667354 Ответов: 2

Запрос на откат транзакции не имеет соответствующей транзакции BEGIN


Я создаю процедуру хранения для чтения типа XML-документа из вторичной таблицы XMLTable. Но при запуске SP или даже самого запроса я получаю следующее сообщение:

"Запрос на откат транзакции не имеет соответствующей транзакции BEGIN."

Код, который я использую, выглядит следующим образом:

--/****** 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


Что я уже пробовал:

НАЧИНАЙ ТРАН
СОВЕРШИТЬ ТРАН
Использование меньшего количества столбцов во вставке для

2 Ответов

Рейтинг:
0

OriginalGriff

Посмотрите на сообщение об ошибке:

The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION
Он не мог быть более конкретным!
Ваш откат в вашем блоке Catch не имеет BEGIN TRANS - там вообще нет транзакции, кроме отката, у вас тоже нет фиксации!

Чтобы откатить транзакцию, вы должны начать транзакцию, сделать обновления в БД и зафиксировать ее, когда она работает, или откатить ее, когда она не работает.


Рейтинг:
0

Santosh kumar Pithani

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