我正在編寫一個存儲過程,以基於表變量參數更新多個記錄。從表變量更新表中的多行
現有的表是:Tb_Project_Image與相關列:
id PK (identity 1,1)
cat_ord decimal(4,2)
程序將收到包含id作爲PI_ID
臨時表變量(在下面的代碼示出),以及用於cat_ord
新值如newCatOrd
。 idx
是包含1 ... n的每一行的簡單標識,其中n是@tempTable
的行數。
對於@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循環的一次迭代拋出一個錯誤,或者不完全影響一行,我想打破循環並回滾事務
我遇到的問題是此錯誤檢查不起作用。我目前使用@tempTable
中的14行運行它,第11次使用Project_Image
表中找不到的PI_ID
。因此,@update = 0...
但它繼續循環並提交數據。
如果有人有這樣做的方法只使用一個更新語句,我會非常高興。
您也可以將@@ ERROR和@@ ROWNCOUNT設置爲變量,如果您在單個語句中執行該操作...'SELECT @error = @@ ERROR,@update = @@ ROWCOUNT' – 2012-08-02 05:15:39
這樣工作就像一個魅力, 謝謝。是的,這個安全網可能永遠不會被絆倒,但我喜歡謹慎。我主要使用回滾,因爲我在最初的代碼中有多個更新。感謝您向我展示一種方式,以便一次完成所有工作。 – 2012-08-02 15:38:53
@LoganDangerBlack不客氣:-) – 2012-08-02 18:05:46