尝试在一个事务中查询然后更新表

why*_*heq 1 sql sql-server sql-server-2008-r2

规格为存储过程是:
要选择并返回Id从我的表tb_r12028dxi_SandpitConsoleProofClient,一旦我选择了这个纪录,它需要被标记(顺序并不重要刚刚找到会做顶1) 'P',这样它不会选择再次.

这是存储过程:

ALTER PROCEDURE [dbo].[r12028dxi_SandpitConsoleProofSweep]
    @myId INT OUTPUT
AS

/*
DECLARE @X INT
EXECUTE [xxx].[dbo].[r12028dxi_SandpitConsoleProofSweep] @X OUTPUT
SELECT @X
*/

DECLARE @NumQueue INT = (
            SELECT [cnt] = COUNT(*) 
            FROM xxx.DBO.tb_r12028dxi_SandpitConsoleProofClient
            WHERE [Status] IS NULL
            );
IF @NumQueue > 0 
    BEGIN

        BEGIN TRANSACTION;

        DECLARE @foundID INT = (SELECT TOP 1 Id FROM xxx.DBO.tb_r12028dxi_SandpitConsoleProofClient WHERE [Status] IS NULL);

        UPDATE x
        SET x.[Status] = 'P'
        FROM xxx.DBO.tb_r12028dxi_SandpitConsoleProofClient x
        WHERE x.Id = @foundID 

        SET @myId = @foundID;

        RETURN;

        COMMIT TRANSACTION;

    END;
GO
Run Code Online (Sandbox Code Playgroud)

它返回错误消息:

EXECUTE之后的事务计数表示BEGIN和COMMIT语句的数量不匹配.先前的计数= 0,当前计数= 1.

我刚刚添加的Update脚本和BEGIN TRANSACTION;以及COMMIT TRANSACTION;在此之前,它工作得很好,当它看起来像下面...

ALTER PROCEDURE [dbo].[r12028dxi_SandpitConsoleProofSweep]
    @myId INT OUTPUT
AS

/*
DECLARE @X INT
EXECUTE [xxx].[dbo].[r12028dxi_SandpitConsoleProofSweep] @X OUTPUT
SELECT @X
*/

DECLARE @NumQueue INT = (
            SELECT [cnt] = COUNT(*) 
            FROM xxx.DBO.tb_r12028dxi_SandpitConsoleProofClient
            WHERE [Status] IS NULL
            );
IF @NumQueue > 0 
    BEGIN


    SELECT TOP 1 @myId = Id FROM xxx.DBO.tb_r12028dxi_SandpitConsoleProofClient;
    RETURN;


    END;
GO
Run Code Online (Sandbox Code Playgroud)

我添加了BEGIN TRANSACTION;/ COMMIT TRANSACTION;因为我想确保数据被读入输出变量并且UPDATE发生了.我应该省略程序的这一部分吗?

ado*_*ntz 5

你有"回归"; 在"COMMIT TRANSACTION"之前 这意味着"COMMIT TRANSACTION;" 从未被执行过.