ROLLBACK TRANSACTION请求没有相应的BEGIN TRANSACTION [英] The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION
问题描述
我正在构建一个存储过程来从辅助XMLTable读取XML文档类型。但是当运行SP甚至查询本身时,我收到以下消息:
ROLLBACK TRANSACTION请求没有相应的BEGIN TRANSACTION。
我使用的代码如下:
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
我尝试过:
BEGIN TRAN
COMMIT TRAN
使用较少的colu mns插入到
What I have tried:
BEGIN TRAN
COMMIT TRAN
Using less columns in the insert to
推荐答案
查看错误消息:
Look at the error message:
The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION
这可能不是更具体!
您的Catch块中的ROLLBACK没有BEGIN TRANS - 根本没有任何交易,除了ROLLBACK,您也没有COMMIT!
要回滚一个事务,你必须开始一个事务,对数据库进行更新,并在它工作时提交它,或者当它没有时回滚它。
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.
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
这篇关于ROLLBACK TRANSACTION请求没有相应的BEGIN TRANSACTION的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!