raiserror(SQL Server自定义异常raiserror使用示例维)
一、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
最小:select 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
另外,虚机团上产品团购,超级便宜
二、如何在sqlserver 的函数或存储过程中抛出异常。
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方式的格式化字符串变量。
第二个参数:severity
用户定义的与该消息关联的严重级别。(这个很重要)
任何用户都可以指定 0到 18之间的严重级别。
[0,10]的闭区间内,不会跳到catch;
如果是[11,19],则跳到catch;
如果[20,无穷),则直接终止数据库连接;
第三个参数:state
如果在多个位置引发相同的用户定义错误,
则针对每个位置使用唯一的状态号有助于找到引发错误的代码段。
介于 1至 127之间的任意整数。(state默认值为1)
当state值为 0或大于 127时会生成错误!
第四个参数:argument
用于代替 msg_str或对应于 msg_id的消息中的定义的变量的参数。
第五个参数:option
错误的自定义选项,可以是下表中的任一值:
LOG:在错误日志和应用程序日志中记录错误;
NOWAIT:将消息立即发送给客户端;
SETERROR:将@@ERROR值和 ERROR_NUMBER值设置为 msg_id或 50000;
[SQL]代码示例
--示例1DECLARE@raiseErrorCode nvarchar(50)
SET@raiseErrorCode= CONVERT(nvarchar(50), YOUR UNIQUEIDENTIFIER KEY)
RAISERROR('%s INVALID ID. There is no record in table',16,1,@raiseErrorCode)
--示例2RAISERROR(
N'This is message%s%d.',-- Message text,
10,-- Severity,
1,-- State,
N'number',-- First argument.
5-- Second argument.
);
-- The message text returned is: This is message number 5.
GO
--示例3RAISERROR(N'<<%*.*s>>',-- Message text.
10,-- Severity,
1,-- State,
7,-- First argument used for width.
3,-- Second argument used for precision.
N'abcde');-- Third argument supplies the string.
-- The message text returned is:<< abc>>.
GO
--示例4RAISERROR(N'<<%7.3s>>',-- Message text.
10,-- Severity,
1,-- State,
N'abcde');-- First argument supplies the string.
-- The message text returned is:<< abc>>.
GO
--示例5
--A.从 CATCH块返回错误消息
以下代码示例显示如何在 TRY块中使用 RAISERROR使执行跳至关联的 CATCH块中。
它还显示如何使用 RAISERROR返回有关调用 CATCH块的错误的信息。
BEGIN TRY
RAISERROR('Error raised in TRY block.',-- Message text.
16,-- Severity.
1-- State.
);
END TRY
BEGIN CATCH
DECLARE@ErrorMessage NVARCHAR(4000);
DECLARE@ErrorSeverity INT;
DECLARE@ErrorState INT;
SELECT
@ErrorMessage= ERROR_MESSAGE(),
@ErrorSeverity= ERROR_SEVERITY(),
@ErrorState= ERROR_STATE();
RAISERROR(@ErrorMessage,-- Message text.
@ErrorSeverity,-- Severity.
@ErrorState-- State.
);
END CATCH;
--示例6
--B.在 sys.messages中创建即席消息
以下示例显示如何引发 sys.messages目录视图中存储的消息。
该消息通过 sp_addmessage系统存储过程,以消息号50005添加到 sys.messages目录视图中。
sp_addmessage@msgnum= 50005,
@severity= 10,
@msgtext= N'<<%7.3s>>';
GO
RAISERROR(50005,-- Message id.
10,-- Severity,
1,-- State,
N'abcde');-- First argument supplies the string.
-- The message text returned is:<< abc>>.
GO
sp_dropmessage@msgnum= 50005;
GO
--示例7
--C.使用局部变量提供消息文本
以下代码示例显示如何使用局部变量为 RAISERROR语句提供消息文本。sp_addmessage@msgnum= 50005,
@severity= 10,
@msgtext= N'<<%7.3s>>';
GO
RAISERROR(50005,-- Message id.
10,-- Severity,
1,-- State,
N'abcde');-- First argument supplies the string.
-- The message text returned is:<< abc>>.
GO
sp_dropmessage@msgnum= 50005;
GO
三、如何在一个SQL Server数据库里使用RAISERROR
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的开始菜单里可以查到)