我正在编写一个存储过程来根据表变量参数更新多条记录。
现有表是:Tb_Project_Image与相关列:
id PK (identity 1,1)
cat_ord decimal(4,2)
该过程将接收一个临时表变量(如下面的代码所示),其中包含 id as和asPI_ID
的新值。是包含 1...n 的每一行的简单标识,其中 n 是 的行数。cat_ord
newCatOrd
idx
@tempTable
对于 中的每一行@tempTable
,我想将Tb_Project_Image
where更新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 行,我想中断循环并回滚事务
我遇到的问题是这个错误检查不起作用。我目前正在运行它,其中有 14 行,@tempTable
第 11 行使用表PI_ID
中未找到的Project_Image
。因此,@update = 0...
但它继续循环并提交数据。
如果有人有一种只使用单个更新语句的方法,我会倍加高兴。