sql server 存储过程

基本语法:

Create proc <sproc name>

[<parameter name> [schema.]<data type>[varying][=<default value>][out [put]][readonly]

[,<parameter name>[schema.]<data type>[varying][=<default value>][out[put]]

[readonly]

[,…]]

[with

Recompile|encryption|[execute as [caller|self|owner|<’user name’>]]

[for replication]

As

<code>|external name<assembly name>.<assembly class>.<method>

 

使用ALTER PROC 和CREATE PROC 语句的唯一区别包括以下几点:

ALTER PROC 期望找到一个已有的存储过程,而create不是

ALTER PROC 保留了存储过程上已经建立的任何权限,他在系统对象中保留了相同的对象ID,并允许保留

依赖关系。

ALTER PROC 在可能调用被修改的存储过程的其他对象上保留了任何依赖信息

 

删除存储过程:drop proc <sproc name>[;]

 

参数化:

声明参数时需要两到四部分的信息:名称,数据类型,默认值,方向

Create proc spemployeebyname

@lastname nvarchar(50)

As

……

Create proc spemployeebyname

@lastname nvarchar(50)=null

As

….

Create proc usplogerror

@errorlogid int=0 output

As

Exec usplogerror @errorlogid=@myoutputparameter output

注意:

对于存储过程声明中的输出参数,需要使用output关键字

和声明存储过程时一样,调用存储过程时必须使用output关键字

Exec关键字是必须的

 

 

通过返回值确认成功或失败:

不管是否提供返回值,程序都会收到一个返回值,默认为0

 

错误处理:

3种常见错误:运行时错误,内联错误,更具逻辑性但不太引起注意的错误

 

以前的方式:

处理内联错误

利用@@error(包含了最后执行的t-sql语句的错误号,如果为0,则没有发生错误)

用try catch处理

在错误发生之前处理错误

手动引发错误:

Raiserror(<message id|message string|variable>,<severity>,<state>

[,<argument>

[,<…n>]])

[with option[,…n]]

Raiserror(‘hi there, I’’m an error’,1,1);

消息 50000,级别1,状态1

 

严重性:1-10,11-16,17,18-19,20-25

状态:1-127

错误参数:所有的占位符都以%符号开始,然后是传递的信息类型的编码

D:有符号的整数

O:无符号的八进制数

P:指针

S:字符串

U:无符号的整数

X:无符号的十六进制数

 

还可以设置宽度,精度,长短

Raiserror(‘this is a sample parameterized %s,along with a zero padding and a sign%+010d’,1,1,’string’,12121)

this is a sample parameterized string,along with a zero padding and a sign+000012121

消息50000,级别1,状态1

 

With <option> 引发的错误还可以混搭3个选项

Log

Seterror

Nowait

 

添加自定义的错误消息:

Sp_addmessage [@msgnum=]<msg id>,

[@severity=]<severity>

[@msgtext=]<’msg’>

[,[@lang=]<’language’>]

[,[@with_log=][true|false]]

[,[@replace=]’replace’]

 

当运行sp_addmessage时,无论使用何种数据库,实际消息都在master数据库,可用sys.messages系统视图查看

删除已有的自定义消息:sp_dropmessage <message number>

 

存储过程的优点:

使得需要过程式动作的进程可调用

安全性,安全隔离层

性能

可重用的代码

对代码进行区域化

根据在运行时建立的动态过程灵活执行

 

在创建了存储过程后,将在第一次执行的时候优化,查询计划被编译并且缓存到系统上。后续几次运行该存储过程,

除非使用with recompile选项指定,否则都会使用缓存的查询计划

 

存储过程的不利方面:

Exec动态查询时,可能会使用错误的计划

不能在平台间移植

 

扩展存储过程(XP)

 

嵌套只能有32层

 

。NET程序集可以和系统关联起来,并用来实现真正复杂的操作,例如可以在自定义函数中使用,从外部数据源提供数据

向数据库中添加一个程序集:

Create assembly <assembly name> authorization <owner name> from <path to assembly>

With permission_set=[safe|external_access|unsafe]

 

 

 

posted on 2013-03-05 13:01  雷音  阅读(200)  评论(0编辑  收藏  举报

导航