了解SQL错误处理脚本

时间:2011-04-20 14:21:51

标签: sql-server tsql error-handling

我是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语法。

  1. 例如,double @符号代表什么?
  2. ROLLBACK TRANSACTION - 这些是SQL保留关键字?
  3. ELSE COMMIT是什么意思?
  4. 谢谢你, 射线

4 个答案:

答案 0 :(得分:5)

  1. @@表示服务器端变量。将它们视为客户端脚本中$var的SQL等价物。
  2. ROLLBACK表示当错误发生时,DB服务器应该“撤消”当前事务 - 基本上丢弃在发生错误之前执行的任何更改。例如,在银行交易中,您将资金从帐户#1转移到帐户#2,如果存款出现问题导致#2,您“撤销”退出#1,因此资金不会因为错误而消失
  3. ELSE COMMIT只是意味着“成功”。
  4. 在伪代码中:

    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),这些更改将保留在数据库中。

RAISERROR (Transact-SQL)

答案 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 :)无关)。 BEGINEND令牌只是分隔符,在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以来)都是永久性的,并且可供所有其他数据用户使用。