深入理解SQL Server 中的错误处理

2016-01-29 15:52 4 1 收藏

深入理解SQL Server 中的错误处理,深入理解SQL Server 中的错误处理

【 tulaoshi.com - SQLServer 】

大多数迭代语言编译器都有内置的错误处理程序(例如,TRY…CATCH语句),开发者们在设计代码的时候可以利用它们。虽然SQL Server 2000的开发者不能够像迭代语言的开发者那样利用内置的工具,但是他们可以用系统变量@@ERROR来设计自己有效的错误处理工具。

引入事务

为了能够掌握在SQL Server 2000中错误处理是如何工作的,你必须首先要理解数据库事务的概念。在数据库术语中,事务就是指作为一个单独的工作单位出现的一系列语句。举个例子来说,假设你有三个语句要执行,事务就可以这样被设计,要么所有三个语句都成功发生,否则就一个都不发生。

在SQL Server中执行数据处理操作时,操作是在缓冲存储器中发生的,并不是立即被写入实际的表格中。然后,当SQL Server运行CHECKPOINT进程时,已经发生的变化才被写入磁盘。这也就意味着,在事务发生的过程中,变化并不被写入磁盘,直到它被提交了,才会被写入。运行时间较长的事务需要更多的处理存储空间,需要数据库保持更长时间的锁定。所以当你在工作环境中设计运行时间长的事务时,一定要小心。

下面是一个很好的例子,说明了利用事务的好处。从ATM中取钱需要以下几个步骤:输入一个PIN号码,选择一个帐户类型和输入你想要提取的资金的金额。如果你试图从ATM中取出50美元,然后操作失败,你肯定不愿意在没有拿到钱的情况下被扣除50美元。事务就可以被用来保证这种一致性。

SQL Server 2000中成功的错误处理需要始终如一地检查系统变量@@ERROR 的值。@@ERROR是指在所有语句在给定的连接下,在服务器上被执行以后,由SQL Server数据库引擎更新的一个变量。这个变量中包括了相应的错误号码,如果有的话。你可以在主数据库的sysmessages表格中找到这些错误号码的列表。关于这个表格的详细资料在微软的网站上已经被列出。

下面是一个说明变量@@ERROR如何工作的例子:

PRINT 'Taking a look at @@ERROR'PRINT @@ERROR

在这些指令中,我们将在屏幕上显示一个字符串,并输出变量@@ERROR的值。因为屏幕上输出的没有错误,所以@@ERROR的值为0。

PRINT 1/0PRINT @@ERROR

在上面这个例子中,我们发生了用0作除数的错误,这样变量@@ERROR中将包括数字8134,它是微软给这种错误分配的错误代号。对于大多数错误处理来说,只有当@@ERROR的值不为0时,即显示有错误发生的时候,你才会关注到它。在记录错误的时候,留意每个错误号码不失为一个好办法,因为这样的话,在调试过程中,调用它们就很方便了。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/sqlserver/)

工作中的错误处理

下面是一个关于怎样在存储过程中利用错误处理的例子。示例脚本的目的是要执行一个存储过程,定义一个事务,然后在一个表格中插入一条记录。因为只是为了解释说明的目的,所以我们用以下的方式设计该程序,这样就可以知道到底是提交还是重新运行该项事务。

执行下面的语句来创建我们在例子将要用到的表格:

CREATE TABLE Transactions(      TranID SMALLINT IDENTITY(1,1) PRIMARY KEY,      EntryDate SMALLDATETIME DEFAULT(GETDATE()),      ParamValue CHAR(1),       ThrowError BIT)

脚本中的两个字段值是ParamValue和ThrowError。这些字段将与我们要创建的程序中的输入参数相对应,并且我们将在提交事务的逻辑中用到它们。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/sqlserver/)

一旦用来记录事务的表格准备就绪之后,

来源:http://www.tulaoshi.com/n/20160129/1496649.html

延伸阅读
一提到访问控制符protected,即使是初学者一般都会很自信的认为自己在这方面的理解没有问题。那好,我们提一个问题出来看看..... 请看下面两端代码,其中包B中的猫和鼠都继承了动物类。 代码如下: //代码1:包A中有一个动物类  package testa;  public class Animal {      protected void crowl(String ...
  函数是进行模块化程序设计的基础,编写复杂的Ajax应用程序,必须对函数有更深入的了解。javascript中的函数不同于其他的语言,每个函数都是作为一个对象被维护和运行的。通过函数对象的性质,可以很方便的将一个函数赋值给一个变量或者将函数作为参数传递。在继续讲述之前,先看一下函数的使用语法: function func1(…){…} var...
标签: 服务器
Linux系统进程深入理解   1. 什么是进程 进程是处于执行期的程序以及它所包含的所有资源的总称,包括虚拟处理器,虚拟空间,寄存器,堆栈,全局数据段等。 在Linux中,每个进程在创建时都会被分配一个数据结构,称为进程控制块(Process Control Block,简称PCB)。PCB中包含了很多重要的信息,供系统调度和进程本身执行使...
标签: 电脑入门
相信很多人都知道什么是系统文件,但很少人知道文本流是什么,其实文本流不难理解,下面图老师小编就给大家详细介绍下Linux文本流,一起来学习下吧。 文本流 文件用于数据的存储,相当于一个个存储数据的房子。我们之前说,所谓的数据是0或者1的序列,但严格来说,Linux以字节(byte)来作为数据的单位,也就是说这个序列每八位(bit)为一...
Java容器类包含List、ArrayList、Vector及map、HashTable、HashMap   ArrayList和HashMap是异步的,Vector和HashTable是同步的,所以Vector和HashTable是线程安全的,而ArrayList和HashMap并不是线程安全的。因为同步需要花费机器时间,所以Vector和HashTable的执行效率要低于ArrayList和HashMap。 Collection ├List  &nbs...

经验教程

446

收藏

47
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部