语法 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
|