存储过程

存储过程

一 存储过程的概念

存储过程是在数据库管理系统保存的,预先编译的,能实现某种功能的SQL程序,它是数据库应用中运用比较广泛的一种数据对象。

为什么需要存储过程?

1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时,可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量。
4.安全性高,可设定只有某些用户才具有对指定存储过程的使用权

存储过程的优点:

1.模块化程序设计

2.执行速度块,效率高

3.减少网络流量

4.具有良好的安全性

二 系统存储过程

SQL_SERVER 提供系统存储过程,它们是一组预编译的T-SQL语句,系统存储过程提供了管理数据库和更新表的机制,并充当从系统表中检索信息的快捷方式。

常用的系统存储过程

系统存储过程

说明

sp_databases

列出服务上的所有数据库

sp_helpdb

报告有关指定数据库或所有数据库的信息

sp_renamedb

更改数据库的名称

sp_tables

返回当前环境下可查询的对象的列表

sp_columns

返回某个表列的信息

sp_help

返回某个表的所有信息

sp_helpconstraint

查看某个表的约束

sp_helpindex

查看某个表的索引

sp_stored_procedures

列出当前环境中的所有存储过程

sp_password

添加或修改登录账户的密码

三 用户自定义的存储过程

1.创建不带参数的存储过程

Create proc usp_selectstu

As

Select StudentName,Gender,GradeId,Phone from dbo.Student

调用存储过程:exec usp_selectstu

2.创建带入参数的存储过程

Create proc usp_stuInfo @gradeid int=2       (默认)

As

Select * from student where gradeId=@gradeid

调用存储过程:exec usp_stuInfo 2

3.创建带出参数的存储过程

create proc usp_selectGrade @name nvarchar(10),@gradeid int output

As

Select @gradeid=gradeid from student where  studentname=@name

print @gradeid

调用存储过程:

declare @id int

exec usp_selectGrade '李小龙',@id output 

  4、 带通配符参数存储过程

Create proc usp_one  @name nvarchar(10)

as

select * from dbo.Student where StudentName like @name

exec usp_one '%'

   5、 不缓存存储过程

缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行。

Sql Server系统内存管理在没有配置内存最大值,很多时候我们会发现运行Sql Server的系统内存往往居高不下。这是由于他对于内存使用的策略是有多少闲置的内存就占用多少,直到内存使用虑达到系统峰值时(预留内存根据系统默认预留使用为准,至少4M),才会清除一些缓存释放少量的内存为新的缓存腾出空间。

这些内存一般都是Sql Server运行时候用作缓存的,例如你运行一个select语句, 执行个存储过程,调用函数;

1. 数据缓存:执行个查询语句,Sql Server会将相关的数据页(Sql Server操作的数据都是以页为单位的)加载到内存中来,下一次如果再次请求此页的数据的时候,就无需读取磁盘了,大大提高了速度。

2.执行命令缓存:在执行存储过程,自定函数时,Sql Server需要先二进制编译再运行,编译后的结果也会缓存起来, 再次调用时就无需再次编译。

 

create proc proc_temp
with recompile
as
    select * from student


exec proc_temp

 

6加密存储过程

exec sp_helptext 储存过程名      可以查看储存过程代码

create proc proc_temp_encryption

with encryption

as

    select * from student;

go

--存储过程的内容不会被轻易看到(虽然解密也是有可能的)。

--应用这个,我们可以对某些关键的存储过程进行加密。

--但此时,存储过程仍然能被executealterdrop

exec proc_temp_encryption;

exec sp_helptext 'proc_temp'

exec sp_helptext 'proc_temp_encryption'

(注意:加密存储过程前应该备份原始存储过程,且加密应该在部署到生产环境前完成。) 

原文地址:https://www.cnblogs.com/yangsongxiao/p/5775899.html