SqlServer存储过程的建立与使用

什么是存储过程?

T-SQL中的存储过程,很是相似于net语言中的方法,它能够重复调用。当存储过程执行一次后,能够将语句缓存中,这样下次执行的时候直接使用缓存中的语句。html

这样就能够提升存储过程的性能。sql

  1.  存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户经过指定存储过程的名称并给出参数来执行。
  2.  存储过程当中能够包含逻辑控制语句和数据操纵语句,它能够接受参数、输出参数、返回单个或多个结果集以及返回值。
  3.  因为存储过程在建立时即在数据库服务器上进行了编译并存储在数据库中,因此存储过程运行要比单个的SQL语句块要快。
  4.  同时因为在调用时只需用提供存储过程名和必要的参数信息,因此在必定程度上也能够减小网络流量、简单网络负担。

 

 


 

存储过程的优势

一、存储过程容许标准组件式编程

存储过程建立后能够在程序中被屡次调用执行,而没必要从新编写该存储过程的SQL语句。数据库

并且数据库专业人员能够随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提升了程序的可移植性。编程

二、存储过程可以实现较快的执行速度

若是某一操做包含大量的T-SQL语句代码,分别被屡次执行,那么存储过程要比批处理的执行速度快得多。缓存

由于存储过程是预编译的,在首次运行一个存储过程 时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。安全

而批处理的T-SQL语句每次运行都须要预编译和优化,因此速度就要慢一些。服务器

三、存储过程减轻网络流量

对于同一个针对数据库对象的操做,若是这一操做所涉及到的T-SQL语句被组织成一存储过程,微信

那么当在客户机上调用该存储过程时,网络中传递的只是该调用语句,不然将会是多条SQL语句。网络

从而减轻了网络流量,下降了网络负载。微信公众平台

四、存储过程可被做为一种安全机制来充分利用

系统管理员能够对执行的某一个存储过程进行权限限制,从而可以实现对某些数据访问的限制,避免非受权用户对数据的访问,保证数据的安全。

 

 


 存储过程的缺点

一、运行速度

对于很简单的sql,存储过程运行速度没有什么优点。 

二、代码可读性差,不易于维护

存储过程的开发调试要比通常程序困难(老版本DB2还只能用C写存储过程,更是一个灾难)。

代码可读性差,不易于难维护。

三、可移植性差

因为存储过程将应用程序绑定到SQLServer,所以使用存储过程封装业务逻辑将限制应用程序的可移植性。

若是应用程序的可移植性在您的环境中很是重要,则将业务逻辑封装在不特定于RDBMS的中间层中多是一个更佳的选择。

 


存储过程的基本语法

变量的声明:
声明变量时必须在变量前加@符号
declare @num int

变量的赋值:
变量赋值时变量前必须加set
set @num= 30

声明多个变量:
declare @name varchar(10),@num int

if语句的使用:

declare @d int
set @d = 1
IF @d = 1
BEGIN
    PRINT '正确' 
END
ELSE BEGIN
PRINT '错误'
END

 

多条件选择语句:

declare @today int
declare @week nvarchar(3)
set @today=3
set @week= case
     when @today=1 then '星期一'
     when @today=2 then '星期二'
     when @today=3 then '星期三'
     when @today=4 then '星期四'
     when @today=5 then '星期五'
     when @today=6 then '星期六'
     when @today=7 then '星期日'
     else '值错误'
end
print @week

 

循环语句:

DECLARE @i INT
SET @i = 1
WHILE @i<1000000 BEGIN
set @i=@i+1
END

 

定义游标:

DECLARE @cur1 CURSOR FOR SELECT .........

OPEN @cur1
FETCH NEXT FROM @cur1 INTO 变量
WHILE(@@FETCH_STATUS=0)
BEGIN
处理.....
FETCH NEXT FROM @cur1 INTO 变量
END
CLOSE @cur1
DEALLOCATE @cur1

存储过程的分类

一、系统存储过程

系统存储过程是系统建立的存储过程,目的在于可以方便的从系统表中查询信息或完成与更新数据库表相关的管理任务或其余的系统管理任务。

系统存储过程主要存 储在master数据库中,以“sp”下划线开头的存储过程。

尽管这些系统存储过程在master数据库中,但咱们在其余数据库仍是能够调用系统存储过 程。

有一些系统存储过程会在建立新的数据库的时候被自动建立在当前数据库中。

1.一、系统存储过程sql示例

--表重命名
exec sp_rename 'stu', 'stud';--列重命名
exec sp_rename 'stud.name', 'sName', 'column';
exec sp_help 'stud';
--重命名索引
exec sp_rename N'student.idx_cid', N'idx_cidd', N'index';
exec sp_help 'student';

--查询全部存储过程
select * from sys.objects where type = 'P';
select * from sys.objects where type_desc like '%pro%' and name like 'sp%';

二、自定义存储过程

所谓自定义存储过程,是指为了完成某一段特定的功能需求,在用户数据库中利用t-sql自行编辑的语句集合,在用户自定义的过程当中能够有输入参数,返回的输出参数及返回至客户端的信息与结果 。

若是在存储过程名称前加了“##”符号,表示建立的存储过程是临时的全局性的;

若是前面的为“#”符号,表示所建立的存储过程是临时的局部的,该存储过程只能在建立它的会话中使用。

以上两种存储过程建立后都存放在tempdb数据库中。

用户自定义存储过程还能够细分为t-sql语言存储过程和CLR存储过程。CLR存储过程是指利用.NET框架公共语言编辑的存储过程,既能够接受用户提供的参数又能够返回存储过程的运行结果,一般用做某个类的公共静态方法。

 2.一、建立不带参数存储过程

--建立一个返回结果集的存储过程(proc或者procedure都可)
if (object_id('proc_get_student', 'P') is not null)--判断存储过程是否存在 另一种 if (exists (select * from sys.objects where name = 'proc_get_student'))//
drop proc proc_get_student --删除存储过程
go
create proc proc_get_student --建立存储过程
as
select * from student; --结果集

--调用执行存储过程,获得返回集(exec或者execute都可)
exec proc_get_student;

2.二、修改存储过程

--修改存储过程
alter proc proc_get_student
as
select * from student;  --修改后的SQL语句

--调用执行存储过程,获得返回集(exec或者execute都可)
exec proc_get_student;

2.三、带参数存储过程

--建立一个返回结果集的存储过程(proc或者procedure都可)
if (object_id('proc_find_stu', 'P') is not null)--判断存储过程是否存在
drop proc proc_find_stu
go
create proc proc_find_stu(@startId int, @endId int)--两个参数
as
select * from student where id between @startId and @endId   --查询语句
go

--调用执行存储过程,2,4为参数
exec proc_find_stu 2, 4;

2.四、带通配符参数存储过程

--建立一个返回结果集的存储过程(proc或者procedure都可)
if (object_id('proc_findStudentByName', 'P') is not null)
drop proc proc_findStudentByName
go
create proc proc_findStudentByName(@name varchar(20) = '%j%', @nextName varchar(20) = '%')
as
select * from student where name like @name and name like @nextName;
go

--调用执行存储过程
exec proc_findStudentByName;
exec proc_findStudentByName '%o%', 't%';

2.五、带输出参数存储过程

--建立一个返回结果集的存储过程(proc或者procedure都可)
if (object_id('proc_getStudentRecord', 'P') is not null)
drop proc proc_getStudentRecord
go
create proc proc_getStudentRecord(
@id int, --默认输入参数
@name varchar(20) out, --输出参数
@age varchar(20) output--输入输出参数
)
as
select @name = name, @age = age from student where id = @id and sex = @age;
go

--调用执行存储过程
declare @id int,
@name varchar(20),
@temp varchar(20);
set @id = 7;
set @temp = 1;
exec proc_getStudentRecord @id, @name out, @temp output;
select @name, @temp;
print @name '#' @temp;

三、扩展存储过程

一般以“xp_”为前缀标识,在sql server系统外经过执行动态连接库,即DLL文件,来实现的功能,该存储过程常用API接口进行编辑,能够加载到sql server实例的地址空间里试试运行。

在sql server常见的扩展存储过程有:

  • xp_enumgroups 指定WINDOWS本地组列表在WINDOWS域中定义的全局组表
  • xp_findnextmsg 接受输入的邮件ID号,返回输出的邮件ID号
  • xp_grantlogin     给用户分配对sql server2012系统的权限
  • xp_logevent    把用户自定义消息输入到sql server日志文件或WINDOWS系统事件查看器中
  • xp_loginconfig 显示sql server 2012实例运行时登录的安全配置

 

好了,咱们就介绍到这里吧,

拜拜,咱们下次见。

 

欢迎关注订阅个人微信公众平台【熊泽有话说】,更多好玩易学知识等你来取
做者:熊泽-学习中的苦与乐
公众号:熊泽有话说
出处: https://www.cnblogs.com/xiongze520/p/14595601.html
创做不易,任何人或团体、机构所有转载或者部分转载、摘录,请在文章明显位置注明做者和原文连接。