我是SQL的新手,我正在尝试理解以下脚本。 有人会为我打破这个吗?
ErrorHandler:
IF @@ERROR <> 0
BEGIN
ROLLBACK TRANSACTION
RAISERROR('Error occurred in script to update version: transaction rolled back', 182, 4)
END
ELSE
COMMIT
我对Java有所了解,所以我理解循环。 这是我需要帮助的SQL语法。
谢谢你, 射线
答案 0 :(得分:5)
$var
的SQL等价物。在伪代码中:
if (something went wrong) {
undo all operations performed since the transaction started;
send out an error message
} else {
save the operations and commit them to disk
}
答案 1 :(得分:2)
@@ ERROR将保留错误编号,如果不是0则发生错误 最好将其存储在变量中,因为任何操作都会将其重置为0,同样适用于@@ rowcount,请参见此处:When should you store @@ROWCOUNT into a variable?
因此,如果它不是0,则脚本将回滚任何工作,如果它为0,则提交事务
提交意味着,更改是持久的,回滚意味着更改将恢复到事务开始之前的状态
从这里开始获取更多信息http://www.sommarskog.se/error_handling_2005.html
答案 2 :(得分:0)
@@Error
是SQL Server中的一个特殊值,它包含在执行的最后一个语句(或者在本例中为Goto ErrorHandler标签之前的语句)上发生的错误的错误号。如果它为零,则最后一个语句成功执行。
Rollback Transaction
(它匹配Commit
)在技术上是SQL词典的一部分。他们确保在发生错误时回滚当前事务。这意味着脚本中发生的所有数据库更改都将被还原,就好像它们从未发生过一样,或者如果没有发生错误(因为@@Error = 0
),这些更改将保留在数据库中。
答案 3 :(得分:0)
该块的结构如下:
IF @@ERROR <> 0
BEGIN
ROLLBACK TRANSACTION
RAISERROR('Error occurred in script to update version: transaction rolled back', 182, 4)
END
ELSE
COMMIT
所以这是用t-sql编写的基本条件(与java :)无关)。
BEGIN
和END
令牌只是分隔符,在java中就像{
和}
一样使用 - 这就是它们在IF分支中使用的原因(两个命令)和不在else分支中使用(单个命令 - 不是强制性的)
@@ Error(以及以@@开头的其他变量,如@@ ROWCOUNT)是系统变量。 @@Error具体包含命令给出的最后一个错误代码,并在代码段中检查它是否一切正常。
如果有错误,则采取两项措施
- 发出ROLLBACK TRANSACTION命令,撤消对数据库所做的所有更改(自上次BEGIN TRANSACTION以来)
- error is raised没有通知调用者异常终止代码。
这里常量(182和4)用于RaiseError调用@severity和@state的参数。我怀疑182是一个拼写错误,因为@severity应该是0-25范围内的数字,并且(按照惯例)18用于“高严重性用户错误”。 @state参数只是您可以添加到调用中的一些数据,以帮助区分多个错误消息。
如果没有错误,则会发出一个COMMIT TRANSACTION,这使得所有更改(自上次BEGIN TRANSACTION以来)都是永久性的,并且可供所有其他数据用户使用。