WEB开发网
开发学院数据库MSSQL Server 基于SQL Server 的Exception Handling - PART I 阅读

基于SQL Server 的Exception Handling - PART I

 2008-12-06 10:15:33 来源:WEB开发网   
核心提示: 下面是执行的结果:对于@@ERROR,有一点需要特别提醒的是:它仅仅代表前一个语句执行的Error Number,基于SQL Server 的Exception Handling - PART I(3),之后任何一段语句的执行都会改变@@ERROR的值,甚至是一个IF语句,user nam

下面是执行的结果:

基于SQL Server 的Exception Handling - PART I

对于@@ERROR,有一点需要特别提醒的是:它仅仅代表前一个语句执行的Error Number,之后任何一段语句的执行都会改变@@ERROR的值,甚至是一个IF语句。我想通过下面一段SQL,你肯定会后一个深刻的认识:

基于SQL Server 的Exception Handling - PART I

我们可以看到,一个简简单单的IF语句就将@@ERROR从8134变成了0。不过想想也很简单,IF语句本身也是一个执行语句,在执行过程中并没有遇到Error,所以@@ERROR应该返回0。这也是我在上面的Sample中通过SET @error = @@ERROR将@@ERROR进行预存的原因。

@@ERROR实际上代表的是在编写SQL或者Stored procedure中对异常的识别,大多数我们通过@@ERROR来判断一段SQL语句是否成功执行,保证没有遇到不可预知的异常。对于一些可以预知的异常在SQL中又该如何处理呢?

我发现很多程序员喜欢使用Output参数来处理这些预知的异常。比如:我们需要编写一个添加User的Stored procedure,user name具有唯一性,添加一个和database中同名的user显然是不合法的,在很多情况下通过一个Output参数来返回操作最终执行的情况,比如:

CREATE Procedure P_USERS_I
  (
    @user_id      varchar(50),
    @user_name  nvarchar(256),
    @flag        INT OUTPUT
  )
AS
IF(EXISTS(SELECT * FROM dbo.T_USERS WHERE LOWERED_USER_NAME = LOWER(@user_name) OR [USER_ID] = @user_id))
  BEGIN
    SET @flag = -1
    RETURN
  END  
INSERT INTO dbo.T_USERS
      ([USER_ID]
      ,[USER_NAME]
      ,LOWERED_USER_NAME)
   VALUES(@user_id, @user_name, LOWER(@user_name))  
SET @flag = @@ERROR

上一页  1 2 3 4  下一页

Tags:基于 SQL Server

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接