Sql server 执行问题后的事务计数

Sql server 执行问题后的事务计数,sql-server,sql-server-2008-r2,Sql Server,Sql Server 2008 R2,我已经编写了一个程序,如下代码行 ALTER PROCEDURE [dbo].[CountrySave] ( @CountryId uniqueidentifier, @CountryName nvarchar(max) ) AS begin tran if exists (select * from Country where CountryID =@CountryId) begin update Country set CountryID = @CountryId, CountryNam

我已经编写了一个程序,如下代码行

ALTER PROCEDURE [dbo].[CountrySave]
(
@CountryId uniqueidentifier,
@CountryName nvarchar(max)
)
AS 
begin tran
if exists (select * from Country where CountryID =@CountryId)
begin
update Country set 
CountryID = @CountryId,
CountryName =@CountryName
where CountryID = @CountryId
end
else
begin
insert INTO Country(CountryID, CountryName) values 
(NewID(),@CountryName)
end
它抛出“EXECUTE后的事务计数”表示BEGIN和COMMIT语句的数量不匹配。上一个计数=0,当前计数=1

在MARS批处理中启动的事务在批处理结束时仍处于活动状态。该事务将回滚。“执行时出现错误消息!!!
请帮助…

添加
COMMIT-TRAN

ALTER PROCEDURE [dbo].[CountrySave]
    @CountryId uniqueidentifier,
    @CountryName nvarchar(max)
AS 
BEGIN
BEGIN TRY
    BEGIN TRAN

    if exists (select * from Country where CountryID =@CountryId)
    begin
         update Country
         set CountryID = @CountryId,
             CountryName =@CountryName
         where CountryID = @CountryId;
     end
     else
     begin
        insert INTO Country(CountryID, CountryName)
        values(NewID(),@CountryName)
    end

    COMMIT TRAN
END TRY
BEGIN CATCH
    /* Error occured log it */
    ROLLBACK
END CATCH
END

错误信息相当清楚。当您打开(开始)一项交易时,您还需要在交易结束时做一些事情

因此,您可以
ROLLBACK
事务(以防事务中的一条语句失败),或者
COMMIT
事务,以便实际实现您所做的所有更改

从MSDN:

BEGIN TRANSACTION表示由 连接在逻辑上和物理上是一致的。如果错误是 遇到,在开始事务后进行的所有数据修改 可以回滚以将数据返回到 一致性。每个事务都会持续,直到完成其中一个事务为止 发出errors和COMMIT事务以使修改生效 数据库的永久部分,或遇到错误,并且 使用ROLLBACK事务语句删除修改


更多信息:

您的问题是您开始了一个事务,但从未提交它/执行回滚

在您的程序中尝试此结构,在过去对我非常有效:

CREATE PROCEDURE [dbo].SomeProc
    (@Parameter INT)
AS
BEGIN
    --if you want to be to only active transaction then uncomment this:
    --IF @@TRANCOUNT > 0
    --BEGIN
    --  RAISERROR('Other Transactions are active at the moment - Please try again later',16,1)
    --END

    BEGIN TRANSACTION

    BEGIN TRY
        /*
            DO SOMETHING
        */

        COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        --Custom Error could be raised here
        --RAISERROR('Something bad happened when doing something',16,1)

        ROLLBACK TRANSACTION
    END CATCH
END

如果一切正常,在末尾添加
COMMIT TRAN
。您应该使用
BEGIN TRY…BEGIN CATCH
包装您的事务,如果发生错误,请添加代码。。。