40. SQL -- 存储过程(1)

存储过程

存储过程的定义

存储过程(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-SQLCLRXP 的比较:

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 将删除该功能。

时间: 2024-10-27 12:43:10

40. SQL -- 存储过程(1)的相关文章

《软件测试自动化之道》读书笔记 之 SQL 存储过程测试

<软件测试自动化之道>读书笔记 之 SQL 存储过程测试 2014-09-28 待测程序测试程序   创建测试用例以及测试结果存储  执行T-SQL脚本  使用BCP工具导入测试用例数据  创建T-SQL 测试套件  当待测存储过程返回行集的时候,如何判断测试结果是否通过  当待测存储过程返回out参数时,如何判断测试结果是否通过  当待测存储过程没有返回值时,如何判断测试结果是否通过 许多基于Windows的系统都使用了SQL Server作为后台组件.待测程序经常通过存储过程来访问数据库.

关于MVC工厂模式的增删改查sql存储过程

这里MVC中用到了反射,工厂,泛型,接口 在搭建框架的时候,除了MVC的三层以外,还有泛型的接口层和工厂层 下面是dal层调用sql存储过程,增删改查,dal层继承了接口层,实现了接口层里面的方法 1 namespace DAL 2 { 3 public class DalHouse : IHouse 4 { 5 public int Add(HouseInfo m) 6 { 7 string sql = "pro_add"; 8 SqlParameter eid = new SqlP

SQL存储过程和函数

SQL存储过程: 由来:在具体应用中,一个完整的操作会包含多条SQL语句,在执行过程中需要根据前面SQL语句的执行结果有选择的执行后面的SQL语句.因此,mysql提供了数据库对象存储过程和函数. 定义:存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令.和函数的区别在于,函数有返回值,存储过程没有. 优点: 1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度.2.当对数据库进行复杂操作时,

插入订单并且输出订单号的sql存储过程

--插入订单-- create proc InsertOrders ( @OrderNumber varchar(300), @OrderState varchar(30), @OrderType varchar(30), @OrderTime DateTime, @OrderFirm varchar(300), @OrderMoney decimal(8,2), @SendWayMoney decimal(8,2), @RegisterId int, @CoalitionOrdersId in

创建sql自定义的函数及商品分页sql存储过程

--商品筛选时判断品牌ID是否存在 --select dbo.isValite(94,94)create function isValite(@brandId int,@bId int)returns intas begin Declare @rNumber int if @brandId = @bId set @rNumber = 1 else set @rNumber = 0 if @bId = 0 set @rNumber = 1 return @rNumberendgo --判断商品筛选

sql存储过程和事务的应用

在去年,学习数据库的时候就学过存储过程了.一直都只知道一些理论,却不知道如何去使用.时隔一年,终于找到如何使用存储过程了. 在机房收费系统中,有些操作,需要多次执行sql语句,多次执行完成才算是完成这个事件流.但是如果其中有一个环节出了错误,那么没出错误的那些操作是不是就多余了. 执行存储过程,就是执行多句SQl语句.而事务,是为了控制这些语句 要么都做,要么 都不做. 在机房收费系统中,执行sql语句的时候. 一般的sql语句使用方法:定义一个字符串,用于存放sql语句.之后指明command

SQL 存储过程 分页

set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go -- ============================================= -- Author: *** -- Create date: 2014-03-27 20:00 -- Description: 采用最新的 row_number() over 技术高效分页方法 -- ============================================= ALTER PRO

SQL 存储过程入门(事务)(四)

SQL 存储过程入门(事务)(四) 本篇我们来讲一下事务处理技术. 为什么要使用事务呢,事务有什么用呢,举个例子. 假设我们现在有个业务,当做成功某件事情的时候要向2张表中插入数据,A表,B表,我们插入的顺序是先插入A,再插入B表,如果都顺利插入成功了,当然没有问题,如果任意一张表插入失败了,而另一张表插入成功了,插入成功的表就是垃圾数据了.我们要判断,任意一张表插入失败都回滚,就是都不插入,这就是事务的基本使用. 一,sql事务定义 所谓事务是用户定义的一个数据库操作序列,是一个不可分割的工作

SQL存储过程实例详解

SQL存储过程实例详解 本文用3个题目,从建立数据库到创建存储过程,详细讲解数据库的功能. 题目1 学校图书馆借书信息管理系统建立三个表: 学生信息表:student 字段名称 数据类型 说明 stuID char(10) 学生编号,主键 stuName Varchar(10) 学生名称 major Varchar(50) 专业 图书表:book 字段名称 数据类型 说明 stuID char(10) 学生编号,主键 stuName Varchar(10) 学生名称 major Varchar(