首页编程raiserror(SQL Server自定义异常raiserror使用示例维)

raiserror(SQL Server自定义异常raiserror使用示例维)

编程之家2024-06-08211次浏览

一、sql 2005 Raiserror的用法

1、说明:创建数据库

raiserror(SQL Server自定义异常raiserror使用示例维)

CREATE DATABASE database-name

2、说明:删除数据库

drop database dbname

3、说明:备份sql server

---创建备份数据的 device

USE master

raiserror(SQL Server自定义异常raiserror使用示例维)

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],..)

根据已有的表创建新表:

raiserror(SQL Server自定义异常raiserror使用示例维)

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的开始菜单里可以查到)

typedef struct,typedef struct和直接struct的区别闪存dv(闪存dv是什么)