Sql 重写过程以避免插入,然后回滚

Sql 重写过程以避免插入,然后回滚,sql,sql-server,tsql,Sql,Sql Server,Tsql,当我尝试验证以下内容时,我遇到proc问题: @invoicenumber+将@invoiceid连接在一起以使 总发票号码 若数据库中已存在总发票号,则抛出“发票 号码已存在' 我遇到的问题是,即使发票号码不存在,它仍然会抛出此错误。我认为这是因为它已经插入了数据,但是在插入之后会回滚,所以尽管看起来它没有插入到表中,但它可能已经被插入了,或者我相信这就是原因 我的问题是,有没有一种方法可以重新编写这个过程来让它正常工作?可能先执行SELECT并进行验证检查,如果可以,然后开始在事务中执行

当我尝试验证以下内容时,我遇到proc问题:

  • @invoicenumber+将@invoiceid连接在一起以使 总发票号码

  • 若数据库中已存在总发票号,则抛出“发票
    号码已存在'

我遇到的问题是,即使发票号码不存在,它仍然会抛出此错误。我认为这是因为它已经插入了数据,但是在插入之后会回滚,所以尽管看起来它没有插入到表中,但它可能已经被插入了,或者我相信这就是原因

我的问题是,有没有一种方法可以重新编写这个过程来让它正常工作?可能先执行SELECT并进行验证检查,如果可以,然后开始在事务中执行insert

我已经在这个问题上停留了一段时间,想看看是否有更有效的方法来避免这个问题

以下是proc和exec:

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

太棒了,效果很好。感谢您对前面问题给出的其他答案:)欢迎您。。。如果其他答案有帮助,也将其标记为正确答案,这将帮助我提高分数:)太棒了,效果很好。感谢您对前面问题给出的其他答案:)欢迎您。。。如果其他答案有帮助,也将其标记为正确答案,这将帮助我提高分数:)