我想更改一个表中某些行的ID,我正在尝试这个:
begin tran
WHILE @iteradorAccion < @FilasTotalesAcciones
BEGIN
--some code
update MyTable
set MyField = @Fieldvalue + '_old'
insert into MyTable(MyField) VALUES(@FieldValue)
END
rollback
我是如何在MyField中不允许两行具有相同值的唯一约束,首先我尝试重命名实际行,然后尝试插入新行。
问题是我遇到了唯一约束的错误。我认为这是因为值的更新还没有进入数据库,所以我试图使用&#34; go&#34;更新和插入之间,但代码不正确。
我可以使用&#34; go&#34;在一个循环中?或者我需要先使用循环重命名,然后再使用第二个循环来插入新行?
非常感谢。
答案 0 :(得分:2)
也许你需要改变
update MyTable
set MyField = @Fieldvalue + '_old'
到
update MyTable
set MyField = @Fieldvalue + '_old'
where MyField = @Fieldvalue
答案 1 :(得分:1)
使用COMMIT()
:
COMMIT TRANSACTION(Transact-SQL)
标记成功的隐式或显式事务的结束。如果@@TRANCOUNT
为1
,则COMMIT TRANSACTION
会自开始以来执行所有数据修改 事务是数据库的永久部分,释放资源 由交易持有,并将@@TRANCOUNT
递减至0
。如果@@TRANCOUNT
大于1
,COMMIT TRANSACTION
递减@@TRANCOUNT
仅1
,且交易仍然有效。
COMMIT { TRAN | TRANSACTION } [ transaction_name | @tran_name_variable ] ]
[ ; ]
<强> transaction_name 强>
被SQL Server数据库引擎忽略。 transaction_name指定由先前的BEGIN TRANSACTION分配的事务名称。 transaction_name必须符合标识符规则,但不能超过32个字符。 transaction_name可以作为可读性辅助,通过向程序员指示与COMMIT TRANSACTION相关联的嵌套BEGIN TRANSACTION。
@ tran_name_variable
是包含有效事务名称的用户定义变量的名称。必须使用char,varchar,nchar或nvarchar数据类型声明变量。如果将超过32个字符传递给变量,则只使用32个字符;其余字符被截断。