存储过程 和 函数

存储过程定义

一种为了完成特定功能的一个或一组sql语句集合。经编译后存储在服务器端的数据库中,可以利用存储过程来加速sql语句的执行。

存储过程的分类

  • 系统存储过程:master数据库中,其他数据库中是可以直接调用,并且不必再前面加上数据库名,创建数据库时,这些系统存储过程在新的数据库中自动创建。

  • 自定义存储过程:用户自己创建的,为完成特定功能而创建。可以传入参数,也可以有返回值,表明存储过程执行是否成功。里面可以只有一个操作,也可以包括多个。

存储过程的执行

execute 存储过程名 参数列表(多个参数,以逗号隔开)

或者

exec 存储过程名 参数列表

存储过程的特点

  • 优点:
  1. 特高应用程序的通用性和可移植性。可多次调用,而不必重新再去编写,维护人员可以随时修改。
  2. 可以更有效的管理数据库的权限。
  3. 提高执行sql的速度。
  4. 减轻服务器的负担。
  5. 安全。调用者需要知道如何调用指定的存储过程即可,而不用关心存储过程的内容,防止 SQL 注入。
    存储过程减轻网络流量对于同一个针对数据库对象的操作,这个操作所涉及到的T-SQL 语句被组织成一存储过程,那么当在客户机上调用该存储过程时,网络中传递的值是该调用语句,否则将会是多条 SQL 语句。从而减轻了网络流量,降低了网络负载。
  • 缺点:
    1.编写复杂
  1. 如果没有相应的权限,你将无法创建存储过程
  2. 当服务器调用过多的存储过程,用户访问量大了,那么压力就丢给数据库来解决,数据库压力就会过大。
  3. 过多的存储过程,优化过于麻烦。

脚本创建存储过程语法

 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、游标、时间戳)

posted @ 2023-01-19 11:15  空岛迷梦  阅读(77)  评论(0编辑  收藏  举报
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css