ストアドプロシージャの仕様は次のとおりです。テーブルから
を選択して返すには(順序は重要ではなく、見つかった上位1つだけで十分です)、そのレコードを選択したらすぐに、選択されないようにマークを付ける必要があります。また。Id
tb_r12028dxi_SandpitConsoleProofClient
'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
次のエラーメッセージが返されます。
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
BEGIN TRANSACTION;
/を追加したのCOMMIT TRANSACTION;
は、データが出力変数に読み込まれ、UPDATEが実行されるようにするためです。手順のこのセクションを省略すべきですか?