当前位置:   article > 正文

数据库——SQL Server存储过程&存储函数_sql server 存储函数

sql server 存储函数

一、定义

  • 存储过程或存储函数也是一类数据库的对象,需要有创建、删除等语句。这里的存储函数指自定义函数。类似于高级语言程序,过程化SQL程序也可以被命名和编译,并保存在数据库中,称为存储过程(stored procedure)存储函数(stored function)。
  • 可以将存储过程理解为一组预先编译好的sql语句的集合,即批处理语句。

二、优缺点

1、存储过程

优点:

  • ①提高代码的重用性
  • ②简化操作
  • ③减少了编译次数, 减少了和数据库服务器的连接次数,提高了效率

缺点:

  • 移植性差,如需兼容多种类型的数据库,尽量少用存储过程

2、存储函数

  • 存储函数和存储过程意义和好处都是一样的,都是持久性存储模块。
  • 存储过程可以没有返回值,也可以有多个返回值,适合做批量插入数据、批量更新等。
  • 存储函数必须指定返回的类型,必须有返回值,而且只能有1个,适合做处理数据后返回1个结果。

三、存储过程

1、创建存储过程

  1. if OBJECT_ID(N'procName',N'P') is not null
  2. drop proc procName
  3. go
  4. /*存储过程首部,以下示例为带参存储过程,如无参,则去掉括号及括号里的内容*/
  5. create procedure procName(
  6. /*参数模式默认IN,在被调用时需要指定参数值,OUT在被调用时不用指定,而是作为返回值返回。
  7. INOUT则既需要指定参数值,也会返回操作的最终值*/
  8. [IN|OUT|INOUT] @paramName1 paramType1,
  9. [IN|OUT|INOUT] @paramName2 paramType2,...)
  10. as
  11. T-SQL程序块
  12. go

详解:

①object_id()

功能为判断资源是否已存在,以确保不会重复命名资源,可接受两个参数,第一个参数代表资源的名称,第二个参数表示该资源的类型,下列表格描述了常用资源类型及说明:

常用资源类型

type

说明

u用户创建的表,区别于系统表(USER_TABLE)
s系统表(SYSTEM_TABLE)
v视图(VIEW)
p存储过程(SQL_STORED_PROCEDURE)

ps:参数前面的N表示N'procName' 表示procName是个Unicode字符串

②drop proc  存储过程名

drop表示删除定义

proc表示存储过程(即资源)

存储过程名称(即资源名称)

CREATE PROCEDURE 存储过程名(
[IN|OUT|INOUT] @参数1 参数类型,
[IN|OUT|INOUT] @参数2 参数类型,...)

上述为存储过程首部,示例为带参存储过程,如无参,则去掉括号及括号里的内容。参数也可以定义输入参数(IN)、输出参数(OUT)或输入/输出(INOUT)参数,默认为输入参数即IN。

  1. IN在被调用时需要指定参数值
  2. OUT在被调用时不用指定,而是作为返回值返回
  3. INOUT则既需要指定参数值,也会返回操作的最终值

④T-SQL程序块

是一个<过程化SQL块>,包括声明部分和可执行语句部分

示例:创建存储过程,实现通过系编号获取该系的学生信息

  1. --创建存储过程,实现通过系编号获取该系的学生信息
  2. CREATE PROCEDURE P_getStudentByStept@Stept nvarchar(50)
  3. AS
  4. BEGIN
  5. select * from student where stept=@Stept
  6. END

2、执行存储过程

语法:

     EXEC 存储过程名称([参数1,参数2,...]);

  1. 使用EXEC方式激活存储过程的执行
  2. sql server数据库支持在存储过程体中调用其他存储过程

示例1:

执行存储过程,查询Cs系的全体学生

  1. --执行存储过程,查询Cs系的全体学生        
  2. exec P_getStudentByStept 'cs'

执行结果1: 

 示例2:

  1. if OBJECT_ID(N'p_getStudentInfo',N'P') is not null
  2. drop proc p_getStudentInfo
  3. go
  4. create procedure p_getStudentInfo
  5. @sno char(12), @flag char(50) output
  6. as
  7. begin
  8. if(dbo.f_getavg(@sno) >80)
  9. set @flag = '优秀'
  10. else if (dbo.f_getavg(@sno) >60)
  11. set @flag = '合格'
  12. else
  13. set @flag = '努力'
  14. end
  15. declare @theResult char(50)
  16. exec p_getStudentInfo '18210120303',@theResult output
  17. select @theResult

3、修改存储过程

  1. --重命名存储过程
  2. ALTER  PROCEDURE  过程名称1 RENAME TO 过程名称2;
  3. --重新编译存储过程
  4. ALTER  PROCEDURE  过程名称 COMPILE;

4、删除存储过程

DROP PROCEDUCE  存储过程名称

四、存储函数(用户自定义函数)

1、创建函数

 ①标量函数--即返回的结果只是一个标量,通俗的讲返回的结果就是一种类型的一个值。

注意:RETURNS后面跟的是返回值类型,RETURN后面跟的是具体的值,比如变量

语法:

  1. CREATE FUNCTION funName(@paramName paramType)
  2. RETURNS returnType ---函数必须而且只能有一个返回值
  3. AS
  4. BEGIN
  5. T-SQL
  6. RETURN '返回值' --程序中必须有return返回语句
  7. END
  8. GO

举例:编写自定义函数,根据学号,获取该同学所有科目的平均分

  1. --编写自定义函数,根据学号,获取该同学所有科目的平均分
  2. if OBJECT_ID(N'f_getavg',N'F') is not null
  3. DROP FUNCTION f_getavg
  4. --上述代码判断函数是否已存在,若存在则删除
  5. go
  6. CREATE FUNCTION f_getavg(@sno char(12)) ---函数名、函数参数
  7. RETURNS numeric(4,1) ---函数返回值必须指定类型而且只能有一个返回值
  8. AS
  9. BEGIN
  10. DECLARE @avg numeric(4,1)
  11. select @avg=avg(scgrade) from sc where sno=@sno
  12. RETURN @avg ---函数必须return返回一个值
  13. END

运行结果:(通过查询语句查询返回的结果值)

 

②内联表值函数--即返回的是一张表数据。

语法:

  1. CREATE FUNCTION funName(@paramName paramType)
  2. RETURNS TABLE
  3. AS
  4. RETURN (select * from Table)
  5. go

示例:编写自定义函数,返回所有同学所有科目的平均分

  1. --编写自定义函数,返回所有同学所有科目的平均分
  2. if OBJECT_ID(N'f_allavg',N'F') is not null
  3. DROP FUNCTION f_allavg
  4. go
  5. CREATE FUNCTION f_allavg()
  6. RETURNS TABLE --返回值类型为表对象
  7. AS
  8. RETURN (select sno,avg(scgrade) avggrade from sc group by sno)
  9. go

运行结果:

③多语句表值函数--即通过多条语句来创建Table类型的数据,自行指定具体的Table类型的结构

  1. if OBJECT_ID(N'f_allavgtable',N'F') is not null
  2. DROP FUNCTION f_allavgtable
  3. go
  4. create function f_allavgtable()
  5. returns @result table(
  6. sno char(12),
  7. avggrade numeric(4,1)
  8. )
  9. as
  10. begin
  11. insert into @result select sno,avg(scgrade) avggrade from sc group by sno
  12. return
  13. end
  14. go
  15. ---调用和上面的一样
  16. select * from f_allavgtable()

2、调用函数

 调用方法和调用系统函数一样

3、删除函数

drop function  自定义函数名;

4、查看自定义函数的信息  

exec sp_helptext '自定义函数名';

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/997148
推荐阅读
相关标签
  

闽ICP备14008679号