基于SQL Server 的Exception Handling - PART I
2008-12-06 10:15:33 来源:WEB开发网很显然通过flag output参数可以得到User的创建操作最终执行的结果:-1代表重名,0代表成功,大于0代表出现不可预知的异常。
说实话,我不太喜欢这样的异常处理方式,其实这并不是说这样的处理不好,大部分还是由于个人喜好决定。我觉得,既然添加一个同名的User本身代表一种Exception,从语义上讲,认为地抛出这样Exception的方式好像更加合理一点,所以我们喜欢通过调用RAISEERROR的方式将一个Error抛出。
二、 RAISEERROR
RAISEEROR是一个系统函数,用于奖某个可以预知的Exception抛出,供Application捕捉并处理,下面是RAISERROR的声明:
RAISERROR ( { msg_id | msg_str | @local_variable }
{ ,severity ,state }
[ ,argument [ ,n ] ] )
[ WITH option [ ,n ] ]
msg_id | msg_str | @local_variable:代表被你抛出的Error的Message,你可以同国3中方式来表示Message:msg_id带面sys.messages中的message_id, msg_str表示一个自定义的文本,@local_variable则表示message的变量。
Severity:一个代表严重程度的数字,其范围为0-25,其中0-18可以由任何用户指定,19-25只能由sysadmin指定。一般地,0-10为严重程度很低的错误,11-18来高级别的错误,19-25代表非常严重的错误,以致在执行完成之后会终止当前的Session。
State:一个0-127的整数,代表一个错误状态,对于在多个地方抛出Message一致的的情况,将State在不同的地方设置在不同的值,在Debug的时候可以很快知道是哪里出错了,所以State具有很现实的意义。
Argument:向我们调用String.Format(string,…)一样,我们可以在一个一个参数中使用{0:G}{1:D}这样的站位符和进行格式处理的字符,这些站位符由后面的参数来填充。在这里也一样,在message中你一可以添加站位符,这着站位符由Argument来填充,具体如何定义,可以参阅SQL Server 2005 Books Online.
WITH option [ ,...n ]:代表一些额外的选项, LOG表示进行日志记录,NOWAIT表示立即将Message递交到客户端,SETERROR强制将当前真实的@@ERROR或者message_id返回到客户端。
明白了RAISERROR如何使用了后,我们可以修改我们的先前创建User的Stored Procedure:
CREATE Procedure P_USERS_I
(
@user_id varchar(50),
@user_name nvarchar(256)
)
AS
IF(EXISTS(SELECT * FROM dbo.T_USERS WHERE LOWERED_USER_NAME = LOWER(@user_name) OR [USER_ID] = @user_id))
BEGIN
RAISERROR ('This role is already existent',16,1)
END
INSERT INTO dbo.T_USERS
([USER_ID]
,[USER_NAME]
,LOWERED_USER_NAME)
VALUES(@user_id, @user_name, LOWER(@user_name))
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››基于IP地址的vsftp服务器
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
更多精彩
赞助商链接