SQL Server中实现错误处理

一、SQLServer数据库引擎错误

1、查询系统错误信息

SQLServer在每个数据库的系统视图sys.messages中存储系统自定义(Message_id <= 50000)和用户自定义(Message_id>50000)错误消息。

2、系统错误信息的严重性级别

得到的系统错误消息分为不同程度的严重性级别。严重性级别是通过数字来表示的,数字越小表示严重级别越低。反之则严重性越高。严重性较高的错误指示需要尽快解决问题。

二、用try...catch发现错误

try...catch结构       

begin try
        要执行的T-SQL代码,一旦错误将传递给catch块进行处理
      end try
      begin catch
        检索和处理错误信息的代码
      end catch
      正常执行的T-SQL语句
  • try:其中,try块是包含在begin try和end try之间的T-SQL代码段,在该代码段中一旦发生错误将传递给catch块,如果没有错误将直接执行catch块后面的代码。
  • catch:catch块是包含在begin catch和end catch之间的T-SQL代码段,在该代码段中检索和处理try块中的错误信息。

三、捕获错误的系统函数

  • error_number()
    返回错误的ID号,对应sys.messages系统视图中的message_id字段。
  • error_line()
    返回T-SQL代码中错误出现的语句行数。
  • error_message()
    返回将返回给应用程序的消息文本。该文本包括为所有可替换参数提供的值,如长度、对象名或时间。对应sys.messages系统视图中的text字段。
  • error_procedure()
    返回出现错误的存储过程或触发器名称。如果在存储过程或触发器中未出现错误,该函数返回NULL。
  • error_severity()
    返回错误的严重性级别。对应sys.messages系统视图中的severity字段。
  • error_state()
    返回状态

示例:

begin try
    select 1/0
end try
begin catch
    select
        error_number() as 'number',
        error_line() as 'line',
        error_message() as 'message',
        error_severity() as 'severity',
        error_state()    as 'state'
end catch

输出结果如图所示:

四、用@@ERROR捕获上一条语句的错误

T-SQL还提供了一个简单的系统函数@@ERROR来捕获上一条语句的错误。如果上一条语句执行成功。@@ERROR系统函数将返回0;如果上一条语句生成错误,@@ERROR将返回错误号。

每条语句完成时@@ERROR都会更改。

例如:

select 1/0
select * from sys.messages where message_id = @@error and language_id = 2052

结果如图:

五、用RAISERROR反馈错误

功能:

将生成的SQLServer引擎错误或警告信息(从sys.messages系统视图获得)反馈到应用程序中。sys.messages系统视图中由SQLServer自身定义的信息,其message_id列的值小于等于5000。

返回用户使用存储过程sp_addmessage创建的自定义消息(存储在系统视图sys.messages中,其message_id大于50000)。

与print语句的区别:

print语句是T-SQL提供的用于反馈信息的语句,print语句只能反馈字符串或字符串表达式的值。

raiserror语句除了print语句的功能外,还支持类似C语言仲printf函数的字符串替换功能。这样可以先在字符串中定义要替换的数据的类型和位置,在输出时自动将字符串内容进行替换。

语法: 

raiserror({ msg_id | msg_str | @local_variable })
        { ,severity,state }
         [ ,argument [ ,...n ] ] )
         [ with option [,...n] ]

参数说明:

  • msg_id:存储在sys.messages系统视图中的错误消息号(message_id)。如果是用户使用as_addmessage系统存储过程自定义的错误消息,其错误号应当大于50000.如果未指定msg_id,则返回一个错误号为50000的错误消息。
  • msg_str:用户自定义消息,msg_str是一个字符串,具有可选的嵌入转换规格。每个转换规格都会定义参数列表中的值。如何格式化并将其置于msg_str中转换规格位置上的字段中,转换规格的格式如下:%[[flag][width][.precision][{h|1}]]type。
  • @local_variable:包含按照msg_str的方式格式化的字符串的任何有效字符串数据类型的变量。@local_variable的数据类型必须为char或varchar,或者必须能够隐式转换为这些数据类型。
  • severity:用户定义的与该消息关联的严重级别。当使用msg_id引发使用sp_addmessage创建的用户定义消息时,paiserror上指定的严重性将覆盖sp_addmessage中指定的严重性。
  • state:状态号,1至少127之间的任意整数。如果在多个位置引发相同的用户自定义错误,则针对每个位置使用唯一的状态好有助于找到引发错误的代码段。
  • argument:用于代替msg_str或对应于msg_id的消息中的定义的变量的参数。可以有0个或多个替代参数,但是替代参数的总数不能超过20个。
  • option:错误的自定义选项。LOG:在SQLServer数据库引擎实例的错误日志和应用程序日志中记录错误;NOWAIT:将消息立即发送给客户端;SETERROR:将@@ERROR值和ERROR_NUMBER值设置为msg_id或50000,不用考虑严重级别。

到此这篇关于SQL Server中实现错误处理的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • SQL SERVER 里的错误处理(try catch)

    BEGIN TRY -- END TRY BEGIN CATCH -- END CATCH. 另外,WITH 语句如果前面还有别的SQL语句,应该在前面的SQL语句结尾加上分号";".比如在这个TRY CATCH里,就应该在前面加个";",如下: BEGIN TRY WITH w AS( SELECT f1,f2,f3 ,ROW_NUMBER() OVER(ORDER BY Id DESC) AS Row FROM [t1] WHERE Code=@Code ) I

  • SQL Server代理:理解SQL代理错误日志处理方法

    SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 如我们在这个系列的前几篇文章所见,SQL Server代理是由一系列的作业步骤组成,每个步骤是不同类型将要进行的工作.如果你在第4篇所见,SQL Server代理也提供使用数据库邮件发送提醒的能力.如果出现问题,不管怎样, 你必须去查看下数据库邮件错误日志.在这篇文章里,你会学到如何理解和查看SQL Server错误日志的所有相关知识.你会

  • SQLserver2000 企业版 出现"进程51发生了严重的异常"错误的处理方法

    情景:一直用到比较好,突然不行 处理步骤:关了360等防火墙:(影响不大,但是有可能是因为杀毒软件处理时把某个关键文件heal了) 装了微软补丁http://www.microsoft.com/downloads/details.aspx?FamilyID=9552d43b-04eb-4af9-9e24-6cde4d933600&displaylang=zh-cn#filelist 重新启动就ok了. 这个工具是微软SQL Server 2000 安全工具,描述为"SQL Server

  • SQL Server中实现错误处理

    一.SQLServer数据库引擎错误 1.查询系统错误信息 SQLServer在每个数据库的系统视图sys.messages中存储系统自定义(Message_id <= 50000)和用户自定义(Message_id>50000)错误消息. 2.系统错误信息的严重性级别 得到的系统错误消息分为不同程度的严重性级别.严重性级别是通过数字来表示的,数字越小表示严重级别越低.反之则严重性越高.严重性较高的错误指示需要尽快解决问题. 二.用try...catch发现错误 try...catch结构 b

  • 在SQL Server中使用 Try Catch 处理异常的示例详解

    目录 如何在 SQL Server 中使用 Try Catch 处理错误? 示例:了解 SQL Server 中的 Try-Catch 实现. 在 SQL Server 中使用 try-catch 的示例 如何在 SQL Server 中使用 Try Catch 处理错误? 从 SQL Server 2005 开始,我们在TRY 和 CATCH块的帮助下提供了结构错误处理机制.使用TRY-CATCH的语法如下所示. BEGIN TRY --这里写可能导致错误的语句 END TRY BEGIN C

  • sql server中错误日志errorlog的深入讲解

    一 .概述 SQL Server 将某些系统事件和用户定义事件记录到 SQL Server 错误日志和 Microsoft Windows 应用程序日志中. 这两种日志都会自动给所有记录事件加上时间戳. 使用 SQL Server 错误日志中的信息可以解决SQL Server的相关问题. 查看 SQL Server 错误日志可以确保进程(例如,备份和还原操作.批处理命令或其他脚本和进程)成功完成. 此功能可用于帮助检测任何当前或潜在的问题领域,包括自动恢复消息(尤其是在 SQL Server 实

  • SQL Server 中 RAISERROR 的用法详细介绍

    SQL Server 中 RAISERROR 的用法 raiserror 的作用: raiserror 是用于抛出一个错误.[ 以下资料来源于sql server 2005的帮助 ] 其语法如下: RAISERROR ( { msg_id | msg_str | @local_variable } { ,severity ,state } [ ,argument [ ,...n ] ] ) [ WITH option [ ,...n ] ] 简要说明一下: 第一个参数:{ msg_id | ms

  • 细说SQL Server中的视图

    1,什么是视图? 2,为什么要用视图: 3,视图中的ORDER BY; 4,刷新视图: 5,更新视图: 6,视图选项: 7,索引视图: 1.什么是视图 视图是由一个查询所定义的虚拟表,它与物理表不同的是,视图中的数据没有物理表现形式,除非你为其创建一个索引:如果查询一个没有索引的视图,Sql Server实际访问的是基础表. 如果你要创建一个视图,为其指定一个名称和查询即可.Sql Server只保存视图的元数据,用户描述这个对象,以及它所包含的列,安全,依赖等.当你查询视图时,无论是获取数据还

  • EXCEL数据上传到SQL SERVER中的简单实现方法

    EXCEL数据上传到SQL SERVER中的方法需要注意到三点!注意点一:要把EXCEL数据上传到SQL SERVER中必须提前把EXCEL传到服务器上.做法: 在ASP.NET环境中,添加一个FileUpload上传控件后台代码的E.X: 复制代码 代码如下: if (FileUpload1.HasFile) //如果用户确实选择了上传控件的浏览按钮,浏览文件成功. { this.FileUpload1.SaveAs("E:\\Temp\\" + FileUpload1.FileNa

  • SQL Server中Check约束的学习教程

    0.什么是Check约束? CHECK约束指在表的列中增加额外的限制条件. 注: CHECK约束不能在VIEW中定义.CHECK约束只能定义的列必须包含在所指定的表中.CHECK约束不能包含子查询. 创建表时定义CHECK约束 1.1 语法: CREATE TABLE table_name ( column1 datatype null/not null, column2 datatype null/not null, ... CONSTRAINT constraint_name CHECK (

  • 在SQL SERVER中导致索引查找变成索引扫描的问题分析

    SQL Server 中什么情况会导致其执行计划从索引查找(Index Seek)变成索引扫描(Index Scan)呢? 下面从几个方面结合上下文具体场景做了下测试.总结.归纳. 1:隐式转换会导致执行计划从索引查找(Index Seek)变为索引扫描(Index Scan) Implicit Conversion will cause index scan instead of index seek. While implicit conversions occur in SQL Serve

  • 在SQL Server中使用命令调用SSIS包的具体方法

    具体操作步骤如下: 1.首先,当然是要在Business Intelligence中设计好包,并调试通过. 2.然后,有两种方式可以在SQL Server中使用命令运行SSIS包 第一种是直接执行ssis包文件,命令如: exec xp_cmdshell 'dtexec /f "c:\test.dtsx"' 第二种是将包文件发布或者导入到Integration Services服务中,然后再执行. 发布包是在Business Intelligence中生成发布文件,并发布到Integr

  • SQL Server误区30日谈 第26天 SQL Server中存在真正的“事务嵌套”

    误区 #26: SQL Server中存在真正的"事务嵌套"错误 嵌套事务可不会像其语法表现的那样看起来允许事务嵌套.我真不知道为什么有人会这样写代码,我唯一能够想到的就是某个哥们对SQL Server社区嗤之以鼻然后写了这样的代码说:"玩玩你们".    让我更详细的解释一下,SQL Server允许你在一个事务中开启嵌套另一个事务,SQL Server允许你提交这个嵌套事务,也允许你回滚这个事务.    但是,嵌套事务并不是真正的"嵌套",对

随机推荐