RAISERROR的使用

KeyLife富翁笔记
作者: HongYuan
标题: RAISERROR的使用
关键字:
分类: sql server 2000
密级: 公开
(评分: , 回复: 0, 阅读: 865) »»

语法
RAISERROR ( { msg_id | msg_str } { , severity , state }
    [ , argument [ ,...n ] ] )
    [ WITH option [ ,...n ] ]

语法分析:
{ msg_id | msg_str }:必需指定错误消息ID或错误消息文本,
severity :指定错误级别(用户可以使用从 0 到 18 之间的严重级别),
state :错误调用状态的信息(值默认为 1)。

RAISERROR ('The level for job_id:%d should be between %d and %d.',
      16, 1, @@JOB_ID, @@MIN_LVL, @@MAX_LVL)

RAISERROR (50005, 16, 1, @@JOB_ID, @@MIN_LVL, @@MAX_LVL)


2005-11-17 15:06:58   
 2005-11-17 15:12:29   

RAISERROR ('The level for job_id:%d should be between %d and %d.',
      16, 1, @@JOB_ID, @@MIN_LVL, @@MAX_LVL)
仅指定错误信息,则客户端无会获取错误编号,即无法分析,这个错误由用户发出,还是SQL自已发出的?

RAISERROR (50005, 16, 1, @@JOB_ID, @@MIN_LVL, @@MAX_LVL)
可以通过sp_addmessage在sysmessages中指定一个错误信息,则客户端可以通过返回的自定义信息号确定是否用户自定义错误信息  

 
 2005-11-17 15:13:03    delphi中通过ADO取得错误信息

var
  i:Integer;
begin
  with RegionDM do
  begin
    try
     adcRgeion.BeginTrans;
     dspRegions.ApplyUpdates(RegionData,0,ErrCount);
     if ErrCount>0 then
     begin
      ShowMessage('系统保存错误,说细内容请查看C:\Error.txt.');
      with adcRgeion do
      begin
        for i:=0 to Errors.Count do
        begin
          //SaveLogfile(''+IntToStr(Errors[i].Number))
          SaveLogfile('C:\Error.txt','原因:'+Errors[i].Source);
          SaveLogfile('C:\Error.txt','错误号:'+IntToStr(Errors[i].NativeError));
          //SaveLogfile(Errors[i].SQLState);
          SaveLogfile('C:\Error.txt','错误说明:'+copy(Errors[i].Description,3,MaxInt));
        end;
      end;
     end;
    except
      adcRgeion.RollbackTrans;
    end;
  end;

 
 2005-11-17 15:36:51   

/*
EXEC sp_addmessage @msgnum = 60000, @severity = 16,
   @msgtext = N'数据库%s,%s失败,请检查%s!',@lang='us_english'

--EXEC sp_addmessage @msgnum = 60000, @severity = 16,@msgtext = N'abc%s%s%s',@lang='简体中文'


declare @_dbname varchar(60)
set @_dbname=db_name()
RAISERROR (60000, 16, 1, @_dbname, '备份', 'C:\Backup\test.bak')

--EXEC sp_dropmessage 60000,@lang='简体中文'
EXEC sp_dropmessage 60000,@lang='us_english'
*/


其实不必增加简体中文版错误信息也可以得到中文错误信息,只要安装有简体中文这种语言就行可以了

 
 2005-11-17 17:07:37    你一眼能看出这个存储过程有什么问题吗?已经在目标数据库中创建成功

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

/*-------------------------------------------------------------------------------------------------
   设计人  :周喜宏    
   设计日期: 2005-11-17  
   修改记录:
   
   功能描述:
     《数据库维护》存储过程主要负责完成数据库的日常备份、恢复操作。
     
     清除过程:首先清除掉除自己外的其它进程对恢复数据库的操作(客户端在此调用前通知用户);
     

   入口参数描述:
      @MaintenanceType:指定数据库操作类型,即 'RESTORE' 或 'BACKUP',缺省为备份数据库
   输出参数描述:
      ADO.Error.Number=5000
      ADO.Error.Description='请除当前数据库其它进程时出错,请手工清除或重启数据库后重试!' or
        '数据库维护出错,可能指定的备份文件或系统问题!'

   测试:
     1.备份:
       exec SP_DataBaseMaintenance @MaintenanceType='BACKUP'

       exec SP_DataBaseMaintenance @FileName='C:\temp\test.bak'

     2.恢复

       exec SP_DataBaseMaintenance @MaintenanceType='RESTORE'

       select * from master..sysprocesses where dbid=db_id() and (spid<>@@SPID)

       exec SP_DataBaseMaintenance @MaintenanceType='RESTORE',@FileName='C:\temp\test.bak'



       RESTORE DATABASE [public] FROM  DISK = N'C:\temp\test.bak'
-------------------------------------------------------------------------------------------------*/
Alter procedure SP_DataBaseMaintenance(@MaintenanceType varchar(7)='BACKUP',@FileName varchar(200)='')  
  as

    if UPPER(@MaintenanceType)<>'RESTORE'
      set @MaintenanceType='BACKUP'

    if @FileName=''
      select @FileName=replace(UPPER(filename),'.MDF','.BAK') from master..sysdatabases where dbid=db_id()
   
     --清除其它进程对恢复数据库的访问
     Declare @ErrorText varchar(100)
     Declare @KillSPID int
     Declare @dbname varchar(100)
     set @dbname=db_name()

     --取得访问当前数据库的(除自己外的)所有进程
     Declare CursorKillSP Cursor For  
       select SPID from master..sysprocesses where dbid=db_id() and spid<>@@SPID
     For Read only

     Open CursorKillSP

     Fetch CursorKillSP into @KillSPID
     while @@fetch_status=0  
     begin
       Execute('kill '+@KillSPID)
       if @@ERROR<>0
       begin
         set @ErrorText='请除当前数据库其它进程时出错,请手工清除或重启数据库后重试!'
         RAISERROR (@ErrorText, 16, 1)
         Close CursorKillSP
         Deallocate CursorKillSP
         Break
       end
       Fetch CursorKillSP into @KillSPID
     end      

    Close CursorKillSP
    Deallocate CursorKillSP


    --恢复当前数据库
    declare @sql varchar(300)
   
    if UPPER(@MaintenanceType)='RESTORE'
      set @sql='SET FMTONLY ON RESTORE DATABASE ['+@dbname+'] FROM  DISK = N'''+@FileName+''' SET FMTONLY OFF'
    else set @sql='SET FMTONLY ON BACKUP DATABASE ['+@dbname+'] TO  DISK = N'''+@FileName+''' SET FMTONLY OFF'

     Execute(@sql)

    if @@ERROR<>0
    begin
      set @ErrorText='数据库维护出错,可能指定的备份文件或系统问题!'--+@sql
      RAISERROR (@ErrorText, 16, 1)    
    end

    --事务内不能执行备份或恢复或Kill操作



GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

posted @ 2006-11-22 08:40  云水浮萍  阅读(4216)  评论(0编辑  收藏  举报