基本语法:
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]