Sql 重写过程以避免插入,然后回滚
当我尝试验证以下内容时,我遇到proc问题:Sql 重写过程以避免插入,然后回滚,sql,sql-server,tsql,Sql,Sql Server,Tsql,当我尝试验证以下内容时,我遇到proc问题: @invoicenumber+将@invoiceid连接在一起以使 总发票号码 若数据库中已存在总发票号,则抛出“发票 号码已存在' 我遇到的问题是,即使发票号码不存在,它仍然会抛出此错误。我认为这是因为它已经插入了数据,但是在插入之后会回滚,所以尽管看起来它没有插入到表中,但它可能已经被插入了,或者我相信这就是原因 我的问题是,有没有一种方法可以重新编写这个过程来让它正常工作?可能先执行SELECT并进行验证检查,如果可以,然后开始在事务中执行
- @invoicenumber+将@invoiceid连接在一起以使 总发票号码
- 若数据库中已存在总发票号,则抛出“发票
号码已存在'
exec SupportAudit.BI.CreateMCCInvoiceReversal 'ABCD/000', 29923, 'ABC', 1
修改TRY块,如下所示
BEGIN TRY
IF exists (select 1 from Jet2Fees.Discount.Invoice where InvoiceNumber = CONCAT(@InvoiceNumber, cast(@InvoiceID as varchar(50))))
BEGIN;
set @errormsg = 'Invoice Number already exists';
THROW 99999, @errormsg, 1
END
ELSE
BEGIN
INSERT INTO [Jet2Fees].Discount.Invoice
(
InvoiceNumber,
DocType
)
OUTPUT '[Jet2Fees].Discount.Invoice', 'InvoiceID', inserted.InvoiceId,
Core.insXMLFragment('InvoiceId')+Core.addnlXMLFragment('InvoiceId', inserted.InvoiceId)
INTO @OutputList
SELECT CONCAT(@InvoiceNumber, cast(InvoiceID as varchar(50))),
@DocType
FROM Jet2Fees.Discount.Invoice
WHERE InvoiceId = @InvoiceId
END
END TRY
修改TRY块,如下所示
BEGIN TRY
IF exists (select 1 from Jet2Fees.Discount.Invoice where InvoiceNumber = CONCAT(@InvoiceNumber, cast(@InvoiceID as varchar(50))))
BEGIN;
set @errormsg = 'Invoice Number already exists';
THROW 99999, @errormsg, 1
END
ELSE
BEGIN
INSERT INTO [Jet2Fees].Discount.Invoice
(
InvoiceNumber,
DocType
)
OUTPUT '[Jet2Fees].Discount.Invoice', 'InvoiceID', inserted.InvoiceId,
Core.insXMLFragment('InvoiceId')+Core.addnlXMLFragment('InvoiceId', inserted.InvoiceId)
INTO @OutputList
SELECT CONCAT(@InvoiceNumber, cast(InvoiceID as varchar(50))),
@DocType
FROM Jet2Fees.Discount.Invoice
WHERE InvoiceId = @InvoiceId
END
END TRY
太棒了,效果很好。感谢您对前面问题给出的其他答案:)欢迎您。。。如果其他答案有帮助,也将其标记为正确答案,这将帮助我提高分数:)太棒了,效果很好。感谢您对前面问题给出的其他答案:)欢迎您。。。如果其他答案有帮助,也将其标记为正确答案,这将帮助我提高分数:)