テーブル変数パラメーターに基づいて複数のレコードを更新するストアド プロシージャを作成しています。
既存のテーブルは次のとおりです:関連する列を持つTb_Project_Image :
id PK (identity 1,1)
cat_ord decimal(4,2)
このプロシージャは、id as とasPI_ID
の新しい値を含む一時テーブル変数 (以下のコードに示す) を受け取ります。は、1...n を含む各行の単純な ID です。ここで、n は の行数です。cat_ord
newCatOrd
idx
@tempTable
の各行について、 whereを対応する値@tempTable
に更新したいと思います。Tb_Project_Image
id = PI_ID
DECLARE @tempTable table (
idx smallint Primary Key IDENTITY(1,1),
PI_ID bigint,
newCatOrd decimal(4, 2) not null )
INSERT INTO @tempTable values (3, 7.01)
INSERT INTO @tempTable values (4, 7.02)
INSERT INTO @tempTable values (5, 7.03)
--etc...
DECLARE @error int
DECLARE @update int
DECLARE @iter int
SET @iter = 1
BEGIN TRAN
WHILE @iter <= (select COUNT(*) from @tempTable)
BEGIN
UPDATE Tb_Project_Image
SET cat_ord = (SELECT newCatOrd FROM @tempTable
WHERE idx = @iter)
WHERE id = (SELECT PI_ID FROM @tempTable
WHERE idx = @iter)
--error checking
set @error = @@ERROR
set @update = @@ROWCOUNT
IF ((@error = 0) AND (@update = 1))
BEGIN
SET @iter = @iter + 1
CONTINUE
END
ELSE
BREAK
END
IF ((@error = 0) AND (@update = 1))
COMMIT TRAN
ELSE
ROLLBACK TRAN
GO
ここで、エラー チェックは、整合性を確保するために、一時テーブルの各行を 1 回更新する必要があるためです。(スペース節約のため説明省略) while ループの 1 回の反復でエラーがスローされた場合、または 1 行に影響しなかった場合は、ループを中断してトランザクションをロールバックしたい
私が抱えている問題は、このエラーチェックが機能していないことです。現在、14行で実行していますが@tempTable
、11行目PI_ID
はテーブルにないものを使用していProject_Image
ます。したがって、@update = 0...
ループを続行し、データをコミットします。
単一の更新ステートメントのみを使用してこれを行う方法が誰かにあれば、私は二重にうれしいです。