• 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

  • 相关阅读:
    Gradle命令行操作
    Web项目构建
    Java构建
    任务操纵
    mysql 查看当前使用的配置文件my.cnf的方法(推荐)
    mysql命令gruop by报错this is incompatible with sql_mode=only_full_group_by
    Oracle注入速查表
    git 初始化项目操作
    mybatis 一次执行多条SQL MySql+Mybatis+Druid之SqlException:sql injection violation, multi-statement not allow
    文件存储 FileUtil FileBaseDto
  • 原文地址:https://www.cnblogs.com/ZhouXiHong/p/568103.html
Copyright © 2020-2023  润新知