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发生了.我应该省略程序的这一部分吗?