我可以在交易中使用“go”吗?

时间:2015-03-11 10:16:08

标签: sql-server

我想更改一个表中某些行的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;在一个循环中?或者我需要先使用循环重命名,然后再使用第二个循环来插入新行?

非常感谢。

2 个答案:

答案 0 :(得分:2)

也许你需要改变

  update MyTable 
         set MyField = @Fieldvalue + '_old'

  update MyTable 
         set MyField = @Fieldvalue + '_old' 
         where MyField = @Fieldvalue  

答案 1 :(得分:1)

使用COMMIT()

  

COMMIT TRANSACTION(Transact-SQL)
  标记成功的隐式或显式事务的结束。如果@@TRANCOUNT1,则COMMIT TRANSACTION会自开始以来执行所有数据修改    事务是数据库的永久部分,释放资源    由交易持有,并将@@TRANCOUNT递减至0。如果    @@TRANCOUNT大于1COMMIT TRANSACTION递减    @@TRANCOUNT1,且交易仍然有效。

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个字符;其余字符被截断。