存储过程 和 函数
存储过程定义
一种为了完成特定功能的一个或一组sql语句集合。经编译后存储在服务器端的数据库中,可以利用存储过程来加速sql语句的执行。
存储过程的分类
-
系统存储过程:master数据库中,其他数据库中是可以直接调用,并且不必再前面加上数据库名,创建数据库时,这些系统存储过程在新的数据库中自动创建。
-
自定义存储过程:用户自己创建的,为完成特定功能而创建。可以传入参数,也可以有返回值,表明存储过程执行是否成功。里面可以只有一个操作,也可以包括多个。
存储过程的执行
execute 存储过程名 参数列表(多个参数,以逗号隔开)
或者
exec 存储过程名 参数列表
存储过程的特点
- 优点:
- 特高应用程序的通用性和可移植性。可多次调用,而不必重新再去编写,维护人员可以随时修改。
- 可以更有效的管理数据库的权限。
- 提高执行sql的速度。
- 减轻服务器的负担。
- 安全。调用者需要知道如何调用指定的存储过程即可,而不用关心存储过程的内容,防止 SQL 注入。
存储过程减轻网络流量对于同一个针对数据库对象的操作,这个操作所涉及到的T-SQL 语句被组织成一存储过程,那么当在客户机上调用该存储过程时,网络中传递的值是该调用语句,否则将会是多条 SQL 语句。从而减轻了网络流量,降低了网络负载。
- 缺点:
1.编写复杂
- 如果没有相应的权限,你将无法创建存储过程
- 当服务器调用过多的存储过程,用户访问量大了,那么压力就丢给数据库来解决,数据库压力就会过大。
- 过多的存储过程,优化过于麻烦。
脚本创建存储过程语法
create procedure/pro proName
列表参数
as
begin
--SQL语句集合
--业务逻辑处理
end
存储过程的参数:
- 和C#语言的方法一样,参数可选
- 参数分为输入参数(向存储过程传入值)、输出参数(存储过程执行后,传出执行结果)
- 输入参数允许有默认值
修改存储过程语句
alter procedure/pro proName
as
begin
--SQL语句集合
end
删除存储过程
drop proc | procedure 存储过程名称
调用存储过程
exec 存储过程名;
exec 存储过程名 参数1 out | output,参数2 out | output2;
函数
函数和存储过程的区别:
两者有一个共同点都是预编译优化后存储在磁盘中,所以效率要比T-SQL 高一点点。值得注意的是,存储过程可以创建或者访问临时表,而函数不可以;同时函数不可以修改表中的数据,或调用产生副作用的函数,比如rand,newid,getdate(当然这并不是绝对的);但是函数可以作为 select 或from 或 where 子句的一部分,而存储过程不可以。
1、字符串函数
1.1 长度与分析用
datalength(char_expr) 返回字符串包含字符数,但不包含后面的空格
substring(erpression,start,length) 取子串
right(char_expr,int_expr) 返回字符串右边int_expr个字符
left(char_expr,int_expr) 返回字符串左边int_expr个字符
1.2 字符操作类
upper(char_expr) 转为大写
lower(char_expr) 转为小写
space(int_expr) 生成int_expr个空格
replicate(char_expr,int_expr) 复制字符串int_expr次
reverse(char_expr) 反转字符串
stuff(char_expr1,start,length,char_expr2) 将字符串char_expr1中的从start开始的length个字符用char_expr2代替
ltrim(char_expr) 去掉左边的空格
rtrim(char_expr) 去掉右边的空格
ascii(char) 取ASCII码
char(ascii) 根据ASCII码取字符
1.3 字符串查找
charindex(char_expr,expression) 返回char_expr的起始位置
patindex("%pattern%",expression) 返回指定迷失的起始位置,否则为0
2 数字函数
ads(numeric_expr) 求绝对值
ceiling(numeric_expr) 取大于等于指定值的最小整数(向上取整)
floor(numeric_expr) 小于等于指定值的最大整数(向下取整)
avg(numeric_expr) 取平均值
exp(float_expr) 返回e的n次方
pi() 3.1415926······(及圆周率π)
power(底数m,指数n) 返回m的n次方
rand(int_expr) 随机数产生器
round(numeric_expr,int_expr) 按照int_expr规定的精度四舍五入
sign(int_expr) 根据正数,零,负数,返回+1,0,-1
sqrt(float_expr) 返回平方根
3 日期时间函数
getdate() 返回日期
datename(datepart,date_expr) 返回名称如June
datepart(datepart,date_expr) 取日期一部分
datediff(datepart,date_expr1,date_expr2) 日期差
dateadd(datepart,number,date_expr)返回日期加上 number
4 系统其他函数
suser_name() 用户登录名
user_name() 用户在数据库中的名字
show_role() 对当前用户起作用的规范
db_name() 数据库名
object_name(obj_id) 数据库对象名
col_name(obj_id,col_id) 列名
valid_name(char_expr) 是否是有效标识符
5 类型转换函数
convert(数据类型[(长度)],表达式[,样式])
将一种数据类型的表达式显式转换为另一种数据类型的表达式;
长度:如果数据类型允许设置长度,可以设置长度,例如varchar(10);
样式:用于将日期类型数据转换为字符数据类型的日期格式的样式。
cast(表达式 as 数据类型[(长度)])
将一种数据类型的表达式显式转换为另一只数据类型的表达式。
例如:select cast(123 as nvarchar) 返回123
select N'年龄:'+cast(23 as nvarchar) 返回 年龄:23
表值函数 和 标量值函数
表值函数:返回一张表
标量函数:返回当个数据类型的值(除BLOB、游标、时间戳)