raiserror

sql中的 raiserror什么意思?。?/h3>RAISERROR
返回用户定义的错误信息并设系统标志,记录发生错误 。通过使用 RAISERROR 语句,客户端可以从 sysmessages 表中检索条目 , 或者使用用户指定的严重度和状态信息动态地生成一条消息 。这条消息在定义后就作为服务器错误信息返回给客户端 。

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

参数
msg_id

存储于 sysmessages 表中的用户定义的错误信息 。用户定义错误信息的错误号应大于 50,000 。由特殊消息产生的错误是第 50,000 号 。

msg_str

是一条特殊消息,其格式与 C 语言中使用的 PRINTF 格式样式相似 。此错误信息最多可包含 400 个字符 。如果该信息包含的字符超过 400 个,则只能显示前 397 个并将添加一个省略号以表示该信息已被截断 。所有特定消息的标准消息 ID 是 14,000 。

msg_str 支持下面的格式:

% [[flag] [width] [precision] [{h | l}]] type

可在 msg_str 中使用的参数包括:

flag

用于确定用户定义的错误信息的间距和对齐的代码 。


可以查阅一下SQL SERVER的联机丛书(在安装了MSSQL的开始菜单里可以查到)

在SQL中raiserror和rollback有什么区别?raiserror的作用是弹出错误信息
弹出错误信息 , 也可以自定义信息内容

rollback回滚之前的数据库操作
比如事务中有两段insert文,insert into student(ID) values(1),insert into student(ID) values(2)
第一条正常执行,第二条执行出现异常,这个时候执行rollback语句 , 则student表中一条记录也没有 。如果不执行rollback,则表中会有条ID为1的记录

sql 怎么用raiserror回滚数据raiserror 是进行错误提示的
begin tran
语句
if @@error0
raiserror('语句未正常执行.请检查',16,1)
rollback tran//回滚操作.
else
commit tran

sql语句中raiserror和return的区别RAISERROR 返回用户定义的错误信息并设系统标志,记录发生错误 。通过使用 RAISERROR 语句,客户端可以从 sysmessages 表中检索条目 , 或者使用用户指定的严重度和状态信息动态地生成一条消息 。
return从查询或过程中无条件退出,不执行位于return之后的语句 。

在sqlserver2000里,有没有办法获得raiserror后的errormessagesql server 2000这个版本中是没有try catch的语法的 。
在Sql 2000中,为了成功执行这个存储过程,我需要在每一条语句后面去判断@@ERROR,如果有错,则执行回滚.
在SQL2005版本及以上才提供此语法,可对待程序代码一样处理Sql中的异常:

BEGIN TRY
BEGIN TRANSACTION
--删除卡的记录
delete from ObjTransportCard where CardId=@CardId
--删除交易的记录
delete from ObjTransaction where CardId=@CardId
COMMIT
END TRY

BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK

DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
SELECT @ErrMsg = ERROR_MESSAGE(),
@ErrSeverity = ERROR_SEVERITY()

RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH

在sql里面raiserror有什么作用的?。?/h3>RAISERROR是抛出SQL语句异常或错误的关键字,在存储过程里经常用到 。
用法:
使用RAISERROR后需带三个参数 , 分别如下:
RAISERROR(参数一,参数二,参数三)
参数一:提示出错信息
参数二:错误的状态
参数三:错误的级别
例如:RAISERROR('过程执行出错,行【100】',16,1) , 16为状态,级别1 , 错误信息为:过程执行出错,行【100】 。

sql中“raiserror(4008,16,10)”语句是什么意思?里面的数字是什么意思?RAISERROR 语句2007-06-07 16:30说明
此语句用于发出错误信号和向客户端发送消息 。

语法
RAISERROR error-number [ format-string ] [, arg-list ]

参数

error-numbererror-number 是大于 17000 的五位整数 。错误号存储在全局变量 @@error 中 。
format-string如果未提供 format-string 或者其为空 , 则使用错误号在系统表中查找错误消息 。Adaptive Server Enterprise 从 SYSMESSAGES 表中获取的消息范围为 17000-19999 。在 Adaptive Server Anywhere 中,此表为空视图,因此这个范围内的错误消息应该提供格式字符串 。编号为 20000 或更大的错误消息从 SYS.SYSUSERMESSAGES 表中获取 。
在 Adaptive Server Anywhere 中,format-string 的长度最多可达 255 字节 。
Adaptive Server Enterprise 中的 RAISERROR 语句支持的扩展值在 Adaptive Server Anywhere 中不受支持 。
对于可选参数列表中的参数,格式字符串可以包含占位符 。这些占位符的形式为 %nn!,其中 nn 是介于 1 到 20 之间的整数 。
中间 RAISERROR 状态和代码信息在过程终止后会丢失 。如果在返回时伴随 RAISERROR 发生了错误,则返回错误信息,而 RAISERROR 信息将丢失 。应用程序可以通过在不同的执行点检查 @@error 全局变量,查询中间 RAISERROR 状态 。
用法

RAISERROR 语句允许发出用户定义的错误并向客户端发送消息 。
权限

无 。
副作用

无 。
另请参见
CREATE TRIGGER 语句 [T-SQL]
ON_TSQL_ERROR 选项 [compatibility]
CONTINUE_AFTER_RAISERROR 选项 [compatibility]
标准和兼容性
SQL/92Transact-SQL 扩展 。

SQL/99Transact-SQL 扩展 。

Sybase受 Adaptive Server Enterprise 支持 。

示例

下面的语句引发错误 23000(该错误在用户定义的错误范围内)并向客户端发送消息 。请注意在 error-number 和 format-string 参数之间有一个逗号 。逗号后的第一项被解释为参数列表中的第一项 。
RAISERROR 23000 'Invalid entry for this column: %1!', @val

下一个示例使用 RAISERROR 禁止连接 。
create procedure DBA.login_check()
begin
// Allow a maximum of 3 concurrent connections
if( db_property('ConnCount') > 3 ) then
raiserror 28000
'User %1! is not allowed to connect -- there are already %2! users logged on',
current user,
cast(db_property('ConnCount') as int)-1;
else
call sp_login_environment;
end if;
end
go
grant execute on DBA.login_check to PUBLIC
go
set option PUBLIC.Login_procedure='DBA.login_check'
go

SQL 中 RAISERROR('违背数据一致性',16,1)中的数字是什么意思抛出一个16级的错误,代码执行时可以捕获到这一个错误 。

SQL触发器问题create or replace trigger t_2
before updateof 成绩on 表
for each row

declare
begin
if:new.cj>:old.cj+5or:new.cj<:old.cj-5 then
Raise_application_error(-20000,'成绩数据的修改幅度在5分以内');
end if;
end;

rollback和fallback的区别roll back向后滚动fall back后退、撤退例句:The car began to roll back down the hill. 汽车开始倒着往山下滑 。The enemy fell back as our troops advanced. 我军部队挺进 , 敌军向后撤退 。

sql中RAISERROR怎么给@@error赋值?》HELP文档中有说明
》@@error不是“赋”值的,应该是“取”值

有人知道SQL的RAISERROR的怎么应用吗?RAISERROR ( { msg_id | msg_str } { , severity , state }
[ , argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]

上面是引用了联机丛书中raiserror的定义 。
其实看了定义也就不该说第几个了,但是按照常用的理解,就按照你的思路来说吧 。

第一个参数:msg_id,自定义错误号应该大于50000,以前在vb中实现了一把,raiserror的这个错误号确实可以被捕获的,看看sql中多少函数跟vb想象 , 这点就可以理解了;msg_str,错误信息提示,里面可以用格式修饰符,将后面的参数数组相对应的值返回 。相应于vb , err.number可以取msg_id,而err.description可以取msg_str了 。

第二个参数:这里通常是定义安全级别跟错误状态的 , 相应的可以参考联机丛书,我就不粘出来了 。

第三个参数:[ , argument [ ,...n ] ],参数组,对应msg_str进行输出 。



举一个操作pubs中表jobs的例子,在表中搜索max_lvl大于1000的信息,如果没有则返回一条错误:
-------------------------------------------------------------
use pubs
declare @count int
select @count=count(*) from jobs where max_lvl>1000
if @count=0
raiserror('有%d个max_lvl>1000的工作',16,1,@count)
-------------------------------------------------------------

执行后将返回:
-------------------------------------------------------------
服务器: 消息 50000,级别 16,状态 1,行 5
有0个max_lvl>1000的工作
-------------------------------------------------------------


希望能帮到你 。

只会简单的SQL语句可以做什么工作你喜欢sql这块,那就多花点时间去学,而不是在这里瞎抱怨自己能力不足 。你所说的这些增删改查,只要是java程序员就会,多花点时间去学学数据库操作深层的东西 。触发器,游标,索引 , 权限等方面知识 。。。

SQL raiserror()提示信息里的字符串如何与变量连接都是字符串,直接拿加号+连接就可以了 。比如等等,你这@a不是字符串 , 要做一次转换raiserror('该课程有X名学生参加考试,平均成绩为'+convert(@a as varchar)+'分 。!',16,1)

怎么获取sql server返回的raiserrorreturn从查询或过程中无条件退出,不执行位于return之后的语句 。而raiserror则还要继续执行错误检查,记录发生错误,并把错误消息返回给客户端 。

在SQL语句直接写事务,怎么在程序里知道是否回滚BEGIN TRAN
insert into AFZKDZJLB1(ACZKBH)values('@ACZKBH');
set @num = @@IDENTITY;
insert into AFZKDZJLB2(ACDYZDBH)values(@num);
RAISERROR('Error raised in TRY block.',16,1);
if(@@error0)
begin
select 0
ROLLBACK
end
ELSE
begin
COMMIT
select 1
end
用 ExecuteScalar() 方法执行 看返回值

sql怎么把 系统提示的错误信息在 raiserror显示出来两个系统使用了相同的参数造成的 。

在SQL中NUMBER(16,5)中的16和5 是什么意思

raiserror

文章插图

长度16 , 小数位数为5在大数据时代中,数据库系统的数据类型与规模在不断扩增,这给数据库管理带来了一定的挑战 。在社会生产生活中 , 对于数据库的应用范围逐步增大,提升数据库开发及应用的效率 , 是保障我国社会生产生活高效运转的关键 。SQL作为一种操作命令集, 以其丰富的功能受到业内人士的广泛欢迎, 成为提升数据库操作效率的保障 。SQL Server数据库的应用,能够有效提升数据请求与返回的速度,有效应对复杂任务的处理,是提升工作效率的关键 。扩展资料:在正式学习SQL语言之前,首先让我们对SQL语言有一个基本认识,介绍一下SQL语言的组成:1、一个SQL数据库是表(Table)的集合,它由一个或多个SQL模式定义 。2、一个SQL表由行集构成,一行是列的序列(集合),每列与行对应一个数据项 。3、一个表或者是一个基本表或者是一个视图 。基本表是实际存储在数据库的表,而视图是由若干基本表或其他视图构成的表的定义 。4、一个基本表可以跨一个或多个存储文件 , 一个存储文件也可存放一个或多个基本表 。每个存储文件与外部存储上一个物理文件对应 。
桥式整流器sql 16-10是什么意思CHARINDEX和PATINDEX搜索字符串时的区别了吧 。PATINDEX函数支持使用通配符,可以用在很多有变化的查找中 。而CHARINDEX不可以 。
根据你自己不同的情况 , 这两个函数对你在SQL Server中的字符串的搜索、控制、分析很有帮助 。

通过SQL语句能不能向软件客户端 触发返回信息 。并且推送多条记录 RAISERROR (@P,16,1)。一次只可以抛出一条错误信息 。

Sybase数据库与sql server有什么区别吗?你好,目前目前大型的数据库都采用oracle,中小型的用sqlServer,建议用sqlserver或者mysql 。
sybase与sqlsrver的内在区别就是:
1.Sybase没有用户自定义函数 。

2.判断fetch成功的全局变量是@@SQLstatus,而不是@@fetch_status 。

3.没有set,赋值与查询通用select 。

4.没有top,返回N行要使用set rowcount N / set rowcount 0

5.raiserror 22009 " "--> raiserror( ' ',16,1)

6.游标一定要在过程中使用,不能单独在查询中使用 。

7.销毁游标要加cursor关键字.如:deallocate cursor cur_tmp

8.没有bigint类型 。

9.create table #t(id numeric(12,0) identity not null),不支持int型,且不能设置起始值和步进值 。

10.不能alter一个存储过程,要先drop掉再create 。

11.没有len函数,使用char_length或datalength等效 。

12.通过sysindexes中的doampg列可返回某表的行数,rowcnt(doampg)。

13.convert函数没有120格式(yyyy-mm-dd hh:mm:ss),需要使用select convert(char(4),datepart(year,getdate()))+ '- '+right( '0 '+convert(varchar(2),datepart(month,getdate())),2)+ '- '+right( '0 '+convert(varchar(2),datepart(day,getdate())),2)+ ' '+convert(char(10),getdate(),8)

14.charindex不能从被查找字符串中按指定位置查找某字符串 。

15.不能使用rtrim函数将数值型转为字符型 。

16.没有cast函数,数值型到字符型转移使用select convert(varchar(10),123)

17.没有replace函数 。

18.没有left函数,只有right函数 。

19.不支持在字段上加[] 。

20.select语句中不支持变量累加,例如:select @SQL=@SQL+colname from tablename

21.在过程及视图中系统会自动将select * 变为select 列1,列2...

22.varchar最大支持16384个字节(SQLServer中是8000)。

23.Sybase不支持表变量 。

24.Sybase不支持instead of触发器 。

25.Sybase没有调度(注:定时执行某个操作)。

sybase与sqlsever哪个好维护Sybase 数据库与sql server 有什么区别吗? 目前目前大型的数据库都采用oracle,中小型的用sqlServer,建议用sqlserver 或者mysql 。sybase 与sqlsrver 的内在区别就是: 1.Sybase 没有用户自定义函数 。2.判断fetch 成功的全局变量是@@SQLstatus,而不是@@fetch_status 。3.没有set,赋值与查询通用select 。4.没有top,返回N 行要使用set rowcount N / set rowcount 0 5.raiserror 22009 " "--> raiserror( ' ',16,1) 6.游标一定要在过程中使用,不能单独在查询中使用 。7.销毁游标要加cursor 关键字.如:deallocate cursor cur_tmp 8.没有bigint 类型 。9.create table #t(id numeric(12,0) identity not null),不支持int 型,且不能设置起始值和步进值 。10.不能alter 一个存储过程,要先drop 掉再create 。11.没有len 函数,使用char_length 或datalength 等效 。12.通过sysindexes 中的doampg 列可返回某表的行数,rowcnt(doampg)。13.convert 函数没有120 格式(yyyy-mm-dd hh:mm:ss),需要使用select convert(char(4),datepart(year,getdate()))+ '- '+right( '0 '+convert(varchar(2),datepart(month,getdate())),2)+ '- '+right( '0 '+convert(varchar(2),datepart(day,getdate())),2)+ ' '+convert(char(10),getdate(),8) 14.charindex 不能从被查找字符串中按指定位置查找某字符串 。15.不能使用rtrim函数将数值型转为字符型 。16.没有cast 函数,数值型到字符型转移使用select convert(varchar(10),123) 17.没有replace 函数 。18.没有left 函数,只有right 函数 。19.不支持在字段上加[] 。20.select 语句中不支持变量累加,例如:select @SQL=@SQL+colname from tablename 21.在过程及视图中系统会自动将select * 变为select 列1,列2... 22.varchar 最大支持16384 个字节(SQLServer 中是8000)。23.Sybase 不支持表变量 。24.Sybase 不支持instead of 触发器 。25.Sybase 没有调度(注:定时执行某个操作)。

sql 如何在存储过程里面返回一个提示给前台客户端,但不是用RAISERROR抛出异常,要能让程序继续往下走raiserror 的作用: raiserror 是用于抛出一个错误 。[ 以下资料来源于sql server 2005的帮助 ]

其语法如下:

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

简要说明一下:

第一个参数:{ msg_id | msg_str | @local_variable }
msg_id:表示可以是一个sys.messages表中定义的消息代号;
使用 sp_addmessage 存储在 sys.messages 目录视图中的用户定义错误消息号 。
用户定义错误消息的错误号应当大于 50000 。

msg_str:表示也可以是一个用户定义消息,该错误消息最长可以有 2047 个字符;
(如果是常量 , 请使用N'xxxx',因为是nvarchar的)
当指定 msg_str 时,RAISERROR 将引发一个错误号为 5000 的错误消息 。

@local_variable:表示也可以是按照 msg_str 方式的格式化字符串变量 。

sql 2005 Raiserror的用法???1、说明:创建数据库
CREATE DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:备份sql server
--- 创建 备份数据的 device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
--- 开始 备份
BACKUP DATABASE pubs TO testBack
4、说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表:
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition only
5、说明:删除新表drop table tabname
6、说明:增加一个列
Alter table tabname add column col type
注:列增加后将不能删除 。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度 。
7、说明:添加主键: Alter table tabname add primary key(col)
说明:删除主键: Alter table tabname drop primary key(col)
8、说明:创建索引:create [unique] index idxname on tabname(col….)
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建 。
9、说明:创建视图:create view viewname as select statement
删除视图:drop view viewname
10、说明:几个简单的基本的sql语句
选择:select * from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙 , 查资料!
排序:select * from table1 order by field1,field2 [desc]
总数:select count * as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最?。簊elect min(field1) as minvalue from table1
11、说明:几个高级查询运算词
A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表 。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行 。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2 。
B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表 。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL) , 不消除重复行 。
C: INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表 。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行 。
注:使用运算词的几个查询结果行必须是一致的 。
12、说明:使用外连接
A、left outer join:
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行 。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right outer join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行 。
C:full outer join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录 。

其次 , 大家来看一些不错的sql语句
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1 <>1
法二:select top 0 * into b from a

2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;

3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..

4、说明:子查询(表名1:a 表名2:b)
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

5、说明:显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

6、说明:外连接查询(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

7、说明:在线视图查询(表名1:a )
select * from (SELECT a,b,c FROM a) T where t.a > 1;

8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值1 and 数值2

9、说明:in 的使用方法
select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

10、说明:两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

11、说明:四表联查问题:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

12、说明:日程安排提前五分钟提醒
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5

13、说明:一条sql 语句搞定数据库分页
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段

14、说明:前10条记录
select top 10 * form table1 where 范围

15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)

17、说明:随机取出10条数据
select top 10 * from tablename order by newid()

18、说明:随机选择记录
select newid()

19、说明:删除重复记录
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

20、说明:列出数据库里所有的表名
select name from sysobjects where type='U'

21、说明:列出表里的所有的
select name from syscolumns where id=object_id('TableName')

22、说明:列示type、vender、pcs字段,以type字段排列 , case可以方便地实现多重选择,类似select 中的case 。
select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
显示结果:
type vender pcs
电脑 A 1
电脑 A 1
光盘 B 2
光盘 A 2
手机 B 3
手机 C 3

23、说明:初始化表table1
TRUNCATE TABLE table1

24、说明:选择从10到15的记录
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
另外,虚机团上产品团购,超级便宜

在SQL Server中如何进行错误捕捉【raiserror】如果在Transact-SQL中发生了错误 , 一般有两种捕捉错误的方法,一种是在客户端代码(如c#、delphi等)中使用类似try...catch的语句进行捕捉;另外一种就是在Transact-SQL中利用Transact-SQL本身提供的错误捕捉机制进行捕捉 。如果是因为Transact-SQL语句的执行而产生的错误,如键值冲突 , 使用第一种和第二种方法都可以捕捉,但是如果是逻辑错误,使用客户端代码进行捕捉就不太方便 。因此,本文就如何使用Transact-SQL进行错误捕捉进行了讨论 。非致命错误(non-fatal error)的捕捉通过执行Transact-SQL而产生的错误可分为两种:致命错误(fatal error)和非致命错误(non-fatal error) 。在Transact-SQL中只可以捕捉非致命错误(如键值冲突),而无法捕捉致命错误(如语法错误) 。在Transact-SQL中可以通过系统变量@@ERROR判断最近执行的一条语句是否成功执行 。如果发生了错误,@@Error的值大于0,否则值为0 。下面举一个例子说明@@ERROR的使用 。假设有一个表table1 , 在这个表中有两个字段f1,f2 。其中f1是主键 。INSERTINTOtable1VALUES(1,'aa')INSERTINTOtable1VALUES(1,'bb')--这条语句将产生一个错误IF@@ERROR0PRINT'键值冲突'当执行第二条语句时发生键值冲突错误,@@ERROR被赋为错误号2627 , 因此输出结果显示'键值冲突' 。使用@@ERROR系统变量时需要注意,@@ERROR只记录最近一次执行的Transact-SQL语句所发生的错误,如果最近一次执行的Transact-SQL没有发生错误,@@ERROR的值为0 。因此,只能在被捕捉的那条Transact-SQL语句后使用@@ERROR 。在SQL Server中,不仅可以捕捉系统提供的错误,还可以自定义错误 。有两种方法可以定义错误信息 。1. 使用sp_addmessage系统存储过程添加错误信息 , 然后使用RAISERROR抛出错误 。sp_addmessage将错误号,错误级别、错误描述等信息添加到系统表中,然后使用RAISERROR根据相应的错误号抛出错误信息 。用户自定义的信息应该从50001开始 。EXECsp_addmessage@msgnum=50001,@severity=16,@msgtext='sql encounter an error(%s).',@lang='us_english'EXECsp_addmessage@msgnum=50001,@severity=16,@msgtext='sql遇到了一个错误(%1!).'如果使用的SQL Server版本是非英语版本,在添加本地错误信息时必须首先添加英文的错误信息 。错误描述可以象c语言中的printf的格式字符串一样使用参数,如%s、%d 。但要注意的是在英文版的错误信息中要使用%s、%d等形式 , 而在本地化的错误信息中要使用%1!、%2!等形式,在每个%?(1 <= ? <= n)后需要加一个!,而且%?的数目必须和英文版的错误信息的参数一致 。在未插入本地化错误信息时,RAISERROR将使用英文版的错误信息 。当插入本地化错误信息时 , RAISERROR使用本地化的错误信息 。RAISERROR(50001,16,1,'测试')输出的结果:服务器: 消息50001,级别16 , 状态1,行1sql遇到了一个错误(测试).其中'测试'字符串通过%1传入本地化的错误描述字符串中 。2. 直接使用RAISERROR将错误抛出 。使用第一种方法虽然使Transact-SQL语句看上去更整洁(这种方法类似于在编程语言中使用常量定义错误信息,然后在不同的地方通过错误编号引用这些错误信息 。) , 但是这样做却使错误信息和数据库的耦合度增加 , 因为如果将这些带有RAISERROR的Transact-SQL放到别的SQL Server数据库上执行,由于在其它的数据库中还未添加错误信息,因此会产生RAISERROR调用错误 , 除非使用sp_addmessage将所需的错误信息再加入到其它的数据库中 。基于上述原因,RAISERROR不仅可以根据错误代码抛出错误信息,也可以直接通过错误描述格式字符串抛出错误信息 。