今天给大家总结一下sql server中的存储过程和函数。本人是小白,里面内容比较初级,大神不喜勿喷 自行飘过就是。。

首先给大家简单列出sql server中的流控制语句,后面会用到的^_^

sql server常用控制语句

1.begin..end语句:该语句用来定义一串由顺序执行的SQL语句构成的块。

begin
statement block
end

2.if....else语句:该语句用来定义有条件执行的某些语句。

 if boolen_expression
statement
[else [if boolean_expression] statement]
示例:查询学号为9704学生的成绩状况                             
if ( select min (mark) from student where sno= '') > 90
print ' 学生成绩全部优秀 '
else
if ( select min (mark) from student where sno= '') >60
print ' 学生成绩全部及格 '
else
print ' 学生成绩全部及格 '

3.while、break和continue语句:写过程序的同学相比对这个并不陌生,直接上代码

示例:学号为9705学生的平均成绩如果小于75,则将该学生的每门成绩以5%的比例提高,当平均成绩大于等于75或者所有课程都及格时,终止操作。

while(select avg( mark) from student) < 75
begin
update student
set mark= mark*1.05
if(select min( mark) from student) >=60
break
end

4.declare语句:用来定义一个局部变量,可用select语句为该变量赋初值。这个变量必须用@开头,跟着一个标识符

 declare @variable_name datatype
[,@variable_name datatype]....

示例:查询学号为9704学生的成绩状况

declare @verygood int
select @verygood = min( mark) /*使用select 赋值*/
from student
where sno= ''
if @verygood > 60
print ' 成绩合格'

5.return语句:用来无条件地退出一个查询或一个过程。

return [int_expression]

6.waitfor语句:用来定义某天中的一个时刻,执行一个语句块。 语法如下

waitfor {delay 'time'| time 'time'}   注:delay后的time表示等待多长时间执行sql语句;time后的time说明在time时间点执行sql语句
示例:在下午15:41执行存储过程update_all_stats 
begin
waitfor time '15:41'
execute update_all_stats
end

使用表结构

文章中用到了三张表,分别为student(学生信息表)、teacher(教师信息表)、course(课程信息表) ,表结构请看下方
 
存储过程
      初印象:存储过程是由SQL语句和控制语句构成的语句串(语句集合)。它不仅可以带有输入参数还可以带有输出参数,存储过程能够通过接收参数,向调用者返回结果集,结果集的格式由调用者确定。返回状态值给调用者,指明调用成功还是失败,包括针对数据库的操作语句,并且可以在一个存储过程中调用另一存储过程。 另外存储过程好处不必多说,比如支持sql重用、执行速度快、减少网络流量、安全可靠。
   在sql server中存储过程分为两类:系统提供存储过程和用户自定义存储过程。 系统存储过程主要存储在master数据库中,并以sp_为前缀,主要是从系统表中获取信息;用户存储过程由用户创建并完成特定功能,这里我主要写的是用户存储过程
 

1. 创建存储过程

sql server中使用create procedure语句创建、编译存储过程。
语法如下:
create procedure procedure_name [;version number]
[{ @parameter data_type}
[varying] [=default value][output]
] [,...n]
[with
{recompile|encryption|recompile,encryption}]
[for replication]
as sql_statement [...n]

解释:

  • procedure_name是存储过程的名称,最多可有128个字符;
  • version number为版本号
  • @parameter是存储过程参数名。可以声明一个或多个参数,当调用该存储过程时,除非定义了参数缺省值,用户必须给出所有的参数值。一个存储过程至多有1024个参数,参数可以用作存储过程中的变量名,但参数不能用作列名、表名或其他数据库对象的名称
  • data_type是参数的数据类型。在存储过程中所有的数据类型都可被用作参数,但是如果参数为游标(cursor)数据类型,则该参数必须被指定为varing和output。
  • varying指定由output参数支持的结果集,仅应用于游标参数。
  • default value是指参数的缺省值。
  • output表明该参数是一个返回参数。用output参数可以向调用者返回信息,该参数在存储过程中可以变化,但是Text类型参数不能用作output参数。
  • recompile指明sql server并不保存该存储过程的执行计划,该存储过程每执行一次都要重新编译。默认每次调用时都使用同一计划
  • encryption为syscomments表中存储过程条目加密,防止用户查看编译后的语句。
  • for replication选项指明了该存储过程只能在复制过程中执行
  • sql_statement是包含在存储过程中的任何数量和类型的sql语句
 示例:创建存储过程usp_select_teacher,查询特定系的教师的信息,判定教师的年龄结构,并将该系教师的平均年龄和最大年龄传递给用户。          
create procedure usp_select_teacher @depart char( 10),@avg_age int output,@max_age int output
as
select * from teacher
where dname= @depart
select @max_age= max(age )
from teacher
where dname= @depart
select @avg_age= avg(age )
from teacher
where dname= @depart
if @avg_age <= 30
select ' 年龄结构'= '年龄结构偏年轻', '平均年龄' =@avg_age
if @avg_age > 30 and @avg_age <=40
select ' 年龄结构'= '年龄结构合理', '平均年龄' =@avg_age
if @avg_age > 40
select ' 年龄结构'= '年龄结构偏大', '平均年龄' =@avg_age

2.调用存储过程

sql server使用execute命令调用存储过程
示例:调用存储过程usp_select_teacher,并查看其输出参数的值。
declare @avgage int ,@maxage int
execute usp_select_teacher ' 计算机', @avgage output, @maxage output

我的运行结果如下:

 
SQL函数
初印象:当要执行一段语句,产生单一值或表时,可使用自定义函数而不是存储过程。与存储过程不同,自定义函数只能返回单一值或表。此外,函数不能执行insert、update和delete操作。在SQL server中,根据函数返回值形式的不同,将用户自定义函数分为3种类型。
  • 标量型函数(Scalar Function):返回一个确定类型的标量值。
  • 内联表值型函数(Inline Table-valued Function):以表的形式返回一个返回值,即返回的是一个表,相当于一个参数化的视图
  • 多声明表值型函数(Multi-statement Table-Valued Function):可以看做标量型和内联表值型函数的结合体。返回值是一个表,但它和标量型函数一样,有一个begin-end语句括起来的函数体,该函数体包含插入语句,向返回表中插入数据。
 
下面给出各种类型的示例代码

1.标量型函数

示例:创建工龄工资计算函数year_wage,共有3个输入参数:工作时间(work_date),当前时间(now_date),工龄工资标准(per_wage).
create function year_wage(@work_date datetime, @now_date datetime,@per_wage decimal)
returns decimal
as
begin
return (( year(@now_date )-year( @work_date)) * @per_wage)
end

调用函数语句:

select dbo. year_wage ('2014-10-01' ,getdate(), 12) as ' 工龄工资'

2.内联表值型函数

示例:创建函数course_student,能够显示student表中选修了某门课程(课程名称)的所有学生的信息。 代码如下:
create function course_student(@course_name varchar(20 ))
returns table
as
return ( select s.*
from student as s,course as c
where s. cno=c .cno and c.cno in(select cno from course
where cname= @course_name))

调用函数语句:

select * from course_student ('数据库设计 ')

3.多声明表值型函数

示例:创建函数teacherInfo,用于查询指定系的教师的姓名、性别、所在系、所授课程的课程号、课程名以及学时信息。
create function [dbo].[TeacherInfo] (@depart varchar (20))
returns @TeacherInfo table
(T_name varchar (8),
T_sex char( 2),
T_dname varchar( 20),
T_cno int primary key ,
T_cname varchar( 20),
t_ctime int)
as
begin
insert @TeacherInfo
select T. TNAME,T .TSEX, T.DNAME ,T. CNO,C .CNAME, C.CTIME
FROM TEACHER AS T,COURSE AS C
WHERE C. CNO=T .CNO
AND T. CNO IN (SELECT CNO FROM TEACHER WHERE DNAME=@depart )
return
end

调用函数语句:

select * from teacherinfo ('数据库设计 ')

希望大家读后不要有不适、呕吐之感== 以上内容都是存储过程、函数基础知识,游标之类的没有出现 本着步步为营原则,先把基础的搞懂再说。我在这里主要起抛砖引玉的作用,希望各位同学能有一点收获就好

 

Sql Server存储过程和函数浅谈的更多相关文章

  1. sql server中常用方法函数

    SQL SERVER常用函数 1.DATEADD在向指定日期加上一段时间的基础上,返回新的 datetime 值. (1)语法: DATEADD ( datepart , number, date ) ...

  2. SQL Server 分隔字符串函数实现

    在SQL Server中有时候也会遇到字符串进行分隔的需求.平时工作中常常遇到这样的需求,例如:人员数据表和人员爱好数据表,一条人员记录可以多多人员爱好记录,而往往人员和人员爱好在界面展示层要一并提交 ...

  3. SQL Server存储过程中使用表值作为输入参数示例

    这篇文章主要介绍了SQL Server存储过程中使用表值作为输入参数示例,使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据,这样 ...

  4. SQL Server UDF用户自定义函数

    UDF的定义 和存储过程很相似,用户自定义函数也是一组有序的T-SQL语句,UDF被预先优化和编译并且尅作为一个单元爱进行调用.UDF和存储过程的主要区别在于返回结果的方式. 使用UDF时可传入参数, ...

  5. 14、SQL Server 存储过程

    SQL Server 存储过程 存储过程类似函数,可以重复使用.相对于函数,存储过程拥有更强大的功能和更高的灵活性. 存储过程中可以包含逻辑控制语句和数据操作语句,可以接受参数,输出参数,返回单个值或 ...

  6. C# 调用存储过程 Sql Server存储过程 存储过程报错,程序中的try

    C#程序调用Sql Server存储过程,存储过程中报错情况,返回值... 0.SQL存储过程 USE [Opos] GO /****** Object: StoredProcedure [dbo]. ...

  7. SQL Server存储过程输入参数使用表值

    转载自:http://blog.csdn.net/smithliu328/article/details/9996149 在2008之前如果我们想要将表作为输入参数传递给SQL Server存储过程使 ...

  8. SQL Server存储过程 对数组参数的循环处理

    方法一 分割 例:通过SQL Server存储过程传送数组参数删除多条记录 eg. ID 值为'1,2,3' 以下存储过程就是删除表中id号为1,2,3的记录: CREATE PROCEDURE De ...

  9. SQL Server 存储过程具体解释

    SQL Server 存储过程具体解释 存储过程的优缺点 ◆长处: 运行速度更快. 存储过程仅仅在创造时进行编译,而一般SQL语句每运行一次就编译一次,所以使用存储过程运行速度更快. 存储过程用于处理 ...

随机推荐

  1. Connecting Docker for Cloud Services using SDN and Network Virtualization

     Abstract The explosive scale of container CPUs needs highly efficient network virtualization Chal ...

  2. Git代理服务器设置和访问Github

    因为现在工作的网络环境有着非常严格的限制,.可以说,在最近的访问通过代理Github它采取了一些曲折的.也积累了一些相关经验.我们认为有必要注意什么. 符合"不要再发明轮子"宗旨, ...

  3. hdu 4557 非诚勿扰 vector的应用 原来vector 可以删除指定位置元素 不过消耗大

    非诚勿扰 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submi ...

  4. 无法识别的属性“targetFramework”。请注意,属性名是大写和小写。错误的解决方案

    "/CRM"应用server错. 配置错误 说明: 在处理向该请求提供服务所需的配置文件时出错.请检查以下的特定错误具体信息并适当地改动配置文件. 分析器错误消息: 无法识别的属性 ...

  5. xshell联系CentOS6.5 iptables要么ls 乱码输出

    今天Xshell 联系CentOS6.5.当终端>编码设置为:Unicode(UTF-8)时刻,跑service iptables restart输出是乱码命令:当编码被设置为:当默认语言.ls ...

  6. POJ 1915-Knight Moves (单向BFS &amp;&amp; 双向BFS 比)

    主题链接:Knight Moves 题意:8个方向的 马跳式走法 ,已知起点 和终点,求最短路 研究了一下双向BFS,不是非常难,和普通的BFS一样.双向BFS只是是从 起点和终点同一时候開始搜索,可 ...

  7. CF 148D. Bag of mice (可能性DP)

    D. Bag of mice time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  8. WMI 获取硬件信息的封装函数与获取联想台式机的出厂编号方法

    原文:WMI 获取硬件信息的封装函数与获取联想台式机的出厂编号方法 今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都是可以提取出来的,就自己把那些公共部分提出出来,以后如果要获取 某部分的 ...

  9. MVC5 Entity Framework学习参加排序、筛选和排序功能

    上一篇文章实现Student 基本的实体CRUD操作.本文将展示如何Students Index页添加排序.筛选和分页功能. 以下是排序完成时.经过筛选和分页功能截图,您可以在列标题点击排序. 1.为 ...

  10. QUIC简要

    QUIC.即Quick UDP Internet Connection,类似于SPDY,相同也是由Google公司在现有已存协议之上进行了扩展设计,而旨在降低网络延迟.之前我曾介绍过SPDY的相关信息 ...