存储过程
存储过程的定义
存储过程(StoredProcedure)是一组为了完成特定功能的SQL 语句集,是利用SQLServer 所提供的Transact-SQL语言所编写的程序。功能是将常用或复杂的工作,预先用SQL语句写好并用一个指定名称存储起来,以后需要数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。存储过程是由流控制和SQL 语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,可由应用程序通过一个调用来执行,而且允许用户声明变量 。同时,存储过程可以接收和输出参数、返回执行存储过程的状态值,也可以嵌套调用。
q 存储过程(procedure)类似于C语言中的函数
q 用来执行管理任务或应用复杂的业务规则
q 存储过程可以带参数,也可以返回结果
q 存储过程可以包含数据操纵语句、变量、逻辑 控制语句等
定义:
存储过程是一系列预先编辑好的、能实现特定数据操作功能的SQL代码集,它与特定的数据库相关联,存储在SQL Server服务器上。用户可以像使用函数一样重复调用这些存储过程,实现它所定义的操作。
创建存储过程优点:
a) 存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
b) 当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete
时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
c) 存储过程可以重复使用,可减少数据库开发人员的工作量
d) 安全性高,可设定只有某些用户才具有对指定存储过程的使用权
创建存储过程的缺点:
2 调试麻烦,但是用 PL/SQL Developer 调试很方便!弥补这个缺点。
2 移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。
2 重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。
2 如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的,维护起来更麻烦。
存储过程的种类
○1 、系统存储过程
以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作。
○2 、本地存储过程
用户创建的存储过程是由用户创建并完成某一特定功能的存储过程,事实上一般所说的存储过程就是指本地存储过程。
○3 、临时存储过程
分为两种存储过程:
一是本地临时存储过程,以井字号(#)作为其名称的第一个字符,则该存储过程将成为一个存放在tempdb 数据库中的本地临时存储过程,且只有创建它的用户才能执行它;
二是全局临时存储过程,以两个井字号(##)号开始,则该存储过程将成为一个存储在tempdb数据库中的全局临时存储过程,全局临时存储过程一旦创建,以后连接到服务器的任意用户都可以执行它,而且不需要特定的权限。
○4 、远程存储过程
在SQLServer2005 中,远程存储过程(Remote Stored Procedures)是位于远程服务器上的存储过程,通常可以使用分布式查询和EXECUTE 命令执行一个远程存储过程。
○5 、扩展存储过程
扩展存储过程(ExtendedStored Procedures)是用户可以使用外部程序语言编写的存储过程,而且扩展存储过程的名称通常以xp_开头。
如何使用扩展存储过程
扩展存储过程注册到SQL Server中之后,这个扩展存储过程就可以像普通存储过程一样被使用。
例如,xp_cmdshell是一个很有用的内置扩展存储过程,它以操作系统命令行解释器的方式执行给定的命令字符串,并以文本行方式返回输出结果。
如:执行语句:
EXECxp_cmdshell dir ‘
可执行DOS命令dir,这里DOS命令DIR显示的是SQL Server 所在的服务器当前目录下的内容。
但如果是在网络中的其他计算机上通过客户端连接来访问SQL Server,执行上面的命令并不能显示本地的目录内容。
删除扩展存储过程
如果SQL Server系统中的扩展存储过程不再需要,可以使用T-SQL语句或SQL
ServerManagement Studio将其删除。
○1 . 使用T-SQL语句删除扩展存储过程
使用T-SQL语句删除扩展存储过程的语法如下:
sp_dropextendedproc[@function_name=] procedure‘
在上面的语法中,[@function_name=] procedure‘是要删除的扩展存储过程名称。
DEMO:执行存储过程sp_dropextendedproc,将扩展存储过程xp_hello从maste库中删除。
USEmaster
EXECsp_dropextendedproc ‘xp_hello‘
○2 、使用SQL ServerManagement Studio删除扩展存储过程
在SQL Server Management Studio中,删除扩展存储过程的步骤如下:
(1)展开服务器组,然后展开服务器。
(2)展开―数据库‖文件夹,展开master数据库,然后单击―扩展存储过程‖文件夹。
(3)在详细信息窗格中右击要删除的扩展存储过程,然后单击―删除‖命令。
(4)要查看删除此扩展存储过程对数据库的影响,单击―显示相关性‖命令。
(5)单击―全部除去‖按钮
系统存储过程:
系统存储过程是指安装SQL Server时由系统创建的存储过程,类似C语言中的系统函数。其大多是一些常用的系统操作。系统存储过程存储在master数据库中,其前缀为sp_。
常用系统存储过程:
系统存储过程 说明
sp_databases 列出服务器上的所有数据库。
sp_helpdb 报告有关指定数据库或所有数据库的信息
sp_renamedb 更改数据库的名称
sp_tables 返回当前环境下可查询的对象的列表
sp_columns 回某个表列的信息
sp_help 查看某个表的所有信息
sp_helpconstraint 查看某个表的约束
sp_helpindex 查看某个表的索引
sp_stored_procedures列出当前环境中的所有存储过程。
sp_password 添加或修改登录帐户的密码。
sp_helptext 显示默认值、未加密的存储过程、用户定义的存储过程、触发器或视图
的实际文本。
DEMO:
exec sp_databases 列出服务器上的所有数据库
返回:
exec sp_helpdb demo_db 报告有关指定数据库或所有数据库的信息
主要返回数据库容量、拥有者、创建日期、文件等信息
返回:
use demo_db
go
exec sp_tables 返回当前环境下可查询的对象的列表
返回:
exec sp_columns timerecords 回某个表列的信息
返回:
exec sp_help timerecords 显示某个表的帮助信息
包含表名称、架构、类型、创建日期、列名、列数值类型、索引、束约等信息
返回:
sp_helpconstraint timerecords 查看表的约束信息
返回:
sp_helpindex timerecords 查看表的索引信息
返回:
use master
go
sp_stored_procedures 列出当前环境中所有的存储过程
返回:
sp_helptext ‘sp_help‘ 显示某对象的创建文件对于加密的对象无效
返回:
扩展存储过程
扩展存储过程使你得以使用编程语言创建自己的外部例程。扩展存储过程与通常的存储过程其实有很大差别。
扩展存储过程是以C语言等编写的外部程序,以动态链接库(Dll)形式存储在服务器上,SQL Server可以动态装载并执行它们。编写好扩展存储过程后,固定服务器角色(sysadamin)成员即可在Sql Server服务器上注册该扩展存储过程,并将它们的执行权限授权其他用户。扩展存储过程只能添加到Master数据库。
DEMO:
use master
go
if exists ( select *from sysdatabases where name = ‘JWGL‘)
drop database JWGL
go
exec xp_cmdshellmkdir d:\sqldata‘,no_output
create database JWGL
on primary
(
name=‘JWGL_data‘,
size=5,
maxsize=100,
filegrowth=15%,
filename=‘d:\sqlData\JWGL_data.mdf‘
)
log on
(
name=‘JWGL_log‘,
size=5,
maxsize=100,
filegrowth=5,
filename=‘d:\sqlData\JWGL_log.ldf‘
)
go
exec xp_cmdshell ‘dird:\sqldata‘
用户自定义存储过程
由用户为完成某一特定功能而编写的存储过程。包含了完成该功能所执行的T-SQL语句及所使用的变量等。
SQL Server 2008 中T-SQL、CLR、XP 的比较:
T-SQL :Transact Structured Query Language SQLSERVER 专用标准结构化查询语言增强版
CLR :Common LanguageRuntime 公共语言运行时
XP :ExtendedStored Procedure SQL Server 扩展存储过程
这三者的比较分析
○1 、CLR与T-SQL 编程模型
a) T-SQL 是将一些语句组合成了一些过程代码,也可以说是在过程代码内部嵌入了查询语言,过程代码包括一些流程控制的语句,通过这些语句跟我们查询的SQL 语句共同的完成了我们这种业务逻辑的定义。
b) CLR 的方式,它有自身的特点,有好的也有坏的,首先对于数据访问,它不是直接执行一个SQL 语句,CLR需要通过ADO.NET(System.Data.Sqlserver)这样一个中介来完成查询,当然查询的参数也是一个SQL 语句,但具体执行的过程需要通过ADO.NET 中介来实现,由于它包括了一层中间层的代码,所以它数据访问的效率赶不上T-SQL;另外CLR 它会产生一个比较冗长的代码,比我们用T-SQL书写的代码方式还要冗长,因为T-SQL 它是解释执行的,而CLR需要经过一个编译的过程;CLR 的优点是容易在各层之间移动代码,比如将中间层业务逻辑的程
序集要移动到数据库层时,直接将程序集布署到相应的数据库即可。
○2 、CLR与T-SQL 性能分析
a) T-SQL 在数据访问方面性能好,适合编写数据访问密集的代码。
b) CLR数据访问性能次之,但优点是可以实现大量的复杂的逻辑过程代码或者是复杂的计算。比如说在BI 方面的应用,如果我们用存储过程那么非常复杂且代码很长,如果用CLR 的方式呢,用托管方式就比较简单经济,因为托管的代码它调用的是.net 的类库而.net 类库自身又提供了很多可用的类库,它非常适用于处理一些大量的计算及逻辑过程。
○3 、CLR与T-SQL 语句的提交、返回分析
a) 过程代码SQL 语句返回,T-SQL 具有优势,SQL 查询语句后很容易将结果返回给客户端。
b) CLR有一个额外的代码层,会造成数据访问的性能降低,它可以通过.net 类库提供的SqlPiple 这样一个对象将结果发送到客户端。
○4 、CLR与T-SQL 导航
a) T-SQL 是通过只进、只读光标实现数据记录的导航,可更新光标当前位置行,适合于执行一系列语句(insert\update\delete\select),带有几个或不带返回到客户端的行,并且不导航产生的行。
b) CLR是通过ADO.NET 里面提供的一个SqlDataReader 实现,不能够更新当前所在的位置行,它适合每行都有复杂的处理。
○5 、CLR与扩展存储过程(XP)
a) 扩展存储过程权限的粒度不及CLR。
b) 后续版本的 MicrosoftSQL Server 将删除该功能。