存储过程总结计算机存储计算机存储.pdf

上传人:C****o 文档编号:95967311 上传时间:2023-09-05 格式:PDF 页数:8 大小:440.96KB
返回 下载 相关 举报
存储过程总结计算机存储计算机存储.pdf_第1页
第1页 / 共8页
存储过程总结计算机存储计算机存储.pdf_第2页
第2页 / 共8页
点击查看更多>>
资源描述

《存储过程总结计算机存储计算机存储.pdf》由会员分享,可在线阅读,更多相关《存储过程总结计算机存储计算机存储.pdf(8页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、1.SQL存储过程概述 在 大型数据库系统中,存储过程和触发器具有很重要的作用。无论是存储过程还是触发 器,都是 SQL 语句和流程控制语句的集合。就本质而言,触发器也是一种存储过程。存储过 程在运算时生成执行方式,所以,以后对其再运行时其执行速度很快。SQL Server 2000 不 仅提供了用户自定义存储过程的功能,而且也提供了许多可作为工具使用的系统存储过程。存储过程的概念 存储过程(Stored Procedure)是一组为了完成特定功能的 SQL 语句集,经编译后存储 在数据库。中用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行 它。在 SQL Server 的

2、系列版本中存储过程分为两类:系统提供的存储过程和用户自定义存 储过程。系统过程主要存储在 master数据库中并以sp_为前缀,并且系统存储过程主要是从 系统表中获取信息,从而为系统管理员管理 SQLServer 提供支持。通过系统存储过程,MSSQL Server 中的许多管理性或信息性的活动(如了解数据库对象、数据库信息)都可以被顺利有 效地完成。尽管这些系统存储过程被放在 master 数据库中,但是仍可以在其它数据库中对 其进行调用,在调用时不必在存储过程名前加上数据库名。而且当创建一个新数据库时,一 些系统存储过程会在新数据库中 被自动创建。用户自定义存储过程是由用户创建并能完成某

3、一特定功能(如查询用户所需数据信息)的存储过程。在本章中所涉及到的存储过程主要是 指用户自定义存储过程。存储过程的优点 当利用 MSSQLServer 创建一个应用程序时,Transaction-SQL 是一种主要的编程语言。若运用 Transaction-SQL 来进行编程,有两种方法。其一是,在本地存储 Transaction-SQL 程序,并创建应用程序向 SQL Server 发送命令来对结果进行处理。其二是,可以把部分用 Transaction-SQL 编写的程序作为存储过程存储在 SQL Server 中,并创建应用程序来调用 存储过程,对数据结果进行处理存储过程能够通过接收参数向

4、调用者返回结果集,结果集的 格式由调用者确定;返回状态值给调用者,指 明调用是成功或是失败;包括针对数据库的操 作语句,并且可以在一个存储过程中调用另一存储过程。我们通常更偏爱于使用第二种方法,即在 SQL Server 中使用存储过程而不是在客户计 算机上调用 Transaction-SQL 编写的一段程序,原因在于存储过程具有以下优点:(1)存储过程允许标准组件式编程 存储过程在被创建以后可以在程序中被多次调用,而不必重新编写该存储过程的 SQL 语 句。而且数据库专业人员可随时对存储过程进行修改,但对应用程序源代码毫无影响(因为 应用程序源代码只包含存储过程的调用语句),从而极大地提高了

5、程序的可移植性。(2)存储过程能够实现较快的执行速度 如果某一操作包含大量的 Transaction-SQL 代码或分别被多次执行,那么存储过程要比 批处理的执行速度快很多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优 化器对其进行分 析、优化,并 给出最终 被存在 系统表中的执行计划。而批处理的 Transaction-SQL 语句在每次运行时都要进行编译和优化,因此速度相对要慢一些。(3)存储过程能够减少网络流量 对于同一个针对数据数据库对象的操作(如查询、修改),如果这一操作所涉及到的 Transaction-SQL 语句被组织成一存储过程,那么当在客户计算机上调用该存储过程

6、时,网 络中传送的只是该调用语句,否则将是多条 SQL 语句,从而大大增加了网络流量,降低网络 负载。4)存储过程可被作为一种安全机制来充分利用 系统管理员通过对执行某一存储过程的权限进行限制,从而能够实现对相应的数据访问 权限的限制,避免非授权用户对数据的访问,保证数据的安全。注意:存储过程虽然既有参数又有返回值,但是它与函数不同。存储过程的返回值只是 指明执行是否成功,并且它不能像函数那样被直接调用,也就是在调用存储过程时,在存储 过程名字前一定要有 EXEC呆留字。2.SQL 存储过程创建 存储过程是保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合。可以创建

7、一个过程供永久使用,或在一个会话中临时使用(局部临时过程),或在所有会 话中临时使用(全局临时过程)。也可以创建在 Microsoft SQL Server 启动时自动运行的存储过程。语法 CREATE PROC EDURE procedure_name ;number parameter data_type VARYING =default OUTPUT ,.n WITH RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION FOR REPLICATION AS sql_statement .n 参数 procedure_name 新存储过程的名称。过程名必须符

8、合标识符规则,且对于数据库及其所有者必须唯一。要创建局部临时过程,可以在 procedure_name 前面加一个编号符(#procedure_name),要创建全局临时过程,可以在 procedure_name 前面加两个编号符(#procedure_name)。完 整的名称(包括#或#)不能超过 128 个字符。指定过程所有者的名称是可选的。number 是可选的整数,用来对同名的过程分组,以便用一 条DROPPROCEDUR语句即可将同组 的过程一起除去。例如,名为 orders 的应用程序使用的过程可以命名为 orderproc;1、orderproc;2 等。DROPPROCEDUR

9、oErderproc 语句将除去整个组。如果名称中包含定界标识 符,则数字不应包含在标识符中,只应在 procedure_name 前后使用适当的定界符。parameter 过程中的参数。在 CREATE PROCEDURE句中可以声明一个或多个参数。用户必须在执 行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。存储过程最多可以有 2.100 个参数。使用 符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。每个过 程的参数仅用于该过程本身;相同的参数名称可以用在其它过程中。默认情况下,参数只能 代替常量,而不能用于代替表名、列名或其它数据库对象的名称。data_typ

10、e 参数的数据类型。所有数据类型(包括 text、ntext 和 image)均可以用作存储过程的 参数。不过,cursor 数据类型只能用于 OUTPUT 参数。如果指定的数据类型为 cursor,也 必须同时指定 VARYING 和 OUTPUT 关键字。说明 对于可以是 cursor 数据类型的输出参数,没有最大数目的限制。VARYING 指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化)。仅适用于游标 参数。default 参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程。默认值必须是 常量或NULL。如果过程将对该参数使用 LIKE关键字,那么默认值中可以

11、包含通配符(_、和A)。OUTPUT 表明参数是返回参数。该选项的值可以返回给 EXEC UTE。使用OUTPUT参数可将信息 返回给调用过程。Text、ntext和image参数可用作OUTPUT参数。使用OUTPUT关键字的 输出参数可以是游标占位符。n 表示最多可以指定 2.100 个参数的占位符。RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION RECOMPILE表明SQL Server不会缓存该过程的计划,该过程将在运行时重新编译。在 使用非典型值或临时值而不希望覆盖缓存在内存中的执行计划时,请使用 RECOMPILE选项。ENCRYPTION表示

12、SQL Server 加密 syscomments 表中包含 CREATE PROCEDURE句文 本的条目。使用 ENCRYPTIO N可防止将过程作为 SQL Server复制的一部分发布。说明 在升级过程中,SQL Server 利用存储在 syscomments 中的加密注释来重新创建 加密过程。FOR REPLICATION 指定不能在订阅服务器上执行为复制创建的存储过程。.使用 FOR REPLICATION 选项创 建的存储过程可用作存储过程筛选,且只能在复制过程中执行。本选项不能和 WITH RECOMPILE选项一起使用。AS 指定过程要执行的操作。sql_statement

13、 过程中要包含的任意数目和类型的 Transact-SQL 语句。但有一些限制。n 是表示此过程可以包含多条 Transact-SQL 语句的占位符。注释 存储过程的最大大小为 128 MB。用户定义的存储过程只能在当前数据库中创建(临时过程除外,临时过程总是在 tempdb 中创建)。在单个批处理中,CREATE PROCEDURE不能与其它 Transact-SQL 语句组合使 用。默认情况下,参数可为空。如果传递 NULL 参数值并且该参数在 CREATE 或 ALTER TABLE 语句中使用,而该语句中引用的列又不允许使用 NULL,则SQL Server会产生一条错误信息。为了防止

14、向不允许使用 NULL 的列传递 NULL 参数值,应向过程中添加编程逻辑或为该列使 用默认值(使用 CREATE 或 ALTER TABLE 的 DEFAULT 关键字)。建议在存储过程的任何 CREATE TABLE 或 ALTER TABLE 语句中都为每列显式指定 NULL 或NOT NULL,例如在创建临时表时。ANSI_DFLT_ON和ANSI_DFLT_OFF选项控制 SQL Server 为列指派 NULL 或 NOT NULL 特性的方式(如果在 CREATETABLE 或 ALTER TABLE 语句中没 有指定的话)。如果某个连接执行的存储过程对这些选项的设置与创建该过程

15、的连接的设置不 同,则为第二个连接创建的表列可能会有不同的为空性,并且 表现出不同的行为方式。如果 为每个列显式声明了 NULL或NOT NULL,那么将对所有执行该存储过程的连接使用相同的为 空性创建临时表。在创建或更改存储过程时,SQL Server 将保存 SET QUOTED_IDENTIFIER和 SET ANSI_NULLS 的设置。执行存储过程时,将使用这些原始设置。因此,所有客户端会话的 SET QUOTED_IDENTIFIER和SET ANSI_NULLS设置在执行存储过程时都将被忽略。在存储过程中 出现的 SET QUOTED_IDENTIFIER 和 SET ANSI_

16、NULLS 语句不影响存储过程的功能。其它 SET 选项(例女口 SET ARITHABORT SET ANSI_WARNING或 SET ANSI_PADDINGS 在创建或更改存储过程时不保存。如果存储过程的逻辑取决于特定的设置,应在过程开头添 加一条 SET 语句,以确保设置正确。从存储过程中执行 SET 语句时,该设置只在存储过程 完成之前有效。之后,设置将恢复为调用存储过程时的值。这使个别的客户端可以设置所需 的选项,而不会影响存储过程的逻辑。说明 SQLServer 是将空字符串解释为单个空格还是解释为真正的空字符串,由兼容级 别设置控制。如果兼容级别小于或等于 65,SQL Se

17、rver 就将空字符串解释为单个空格。如果兼容级别等于 70,则 SQL Server 将空字符串解释为空字符串。获得有关存储过程的信息 若要显示用来创建过程的文本,请在过程所在的数据库中执行 sp_helptext,并使用过 程名作为参数。说明使用ENCRYPTION选项创建的存储过程不能使用 sp_helptext 查看。若要显示有关过程引用的对象的报表,请使用 sp_depends。若要为过程重命名,请使用 sp_rename。引用对象 SQLServer 允许创建的存储过程引用尚不存在的对象。在创建时,只进行语法检查。执 行时,如果高速缓存中尚无有效的计划,则编译存储过程以生成执行计划

18、。只有在编译过 程 中才解析存储过程中引用的所有对象。因此,如果语法正确的存储过程引用了不存在的对象,则仍可以成功创建,但在运行时将失败,因为所引用的对象不存在。延迟名称解析和兼容级别 SQLServer 允许 Transact-SQL 存储过程在创建时引用不存在的表。这种能力称为延迟 名称解析。不过,如果 Transact-SQL 存储过程引用了该存储过程中定义的表,而兼容级别 设置(通过执行 sp_dbcmptlevel 来设置)为 65,则在创建时会发出警告信息。而如果在运 行时所引用的表不存在,将返回错误信息。执行存储过程 成功执行 CREATE PROCEDURE句后,过程名称将存储

19、在 sysobjects 系统表中,而 CREATE PROCEDURE句的文本将存储在 syscomme nts中。第一次执行时,将编译该过程以 确定检索数据的最佳访问计划。使用 cursor 数据类型的参数 存储过程只能将 cursor 数据类型用于 OUTPUT 参数。如果为某个参数指定了 cursor 数据类型,也必须指定VARYING和OUTPUT参数。如果为某个参数指定了 VARYING关键字,则数据类型必须是 cursor,并且必须指定 OUTPUT 关键字。说明 cursor数据类型不能通过数据库 API(例如OLE DB ODBC ADO和DB-Library)绑定到应用程序

20、变量上。因为必须先绑定 OUTPUT参数,应用程序才可以执行存储过程,所 以带有 cursor OUTPUT 参数的存储过程不能通过数据库 API 调用。只有将 cursor OUTPUT 变量赋值给 Transact-SQL 局部 cursor 变量时,才可以通过 Transact-SQL 批处理、存储 过程或触发器调用这些过程。Cursor 输出参数 在执行过程时,以下规则适用于 cursor 输出参数:对于只进游标,游标的结果集中返回的行只是那些存储过程执行结束时处于或超出游标 位置的行,例如:在过程中的名为 RS 的 100 行结果集上打开一个非滚动游标。过程提取结果集 RS 的头 5

21、 行。过程返回到其调用者。返回到调用者的结果集 RS 由 RS 的第 6 到 100 行组成,调用者中的游标处于 RS 的 第一行之前。对于只进游标,如果存储过程完成后,游标位于第一行的前面,则整个结果集将返回给 调用批处理、存储过程或触发器。返回时,游标将位于第一行的前面。对于只进游标,如果存储过程完成后,游标的位置超出最后一行的结尾,则为调用批处 理、存储过程或触发器返回空结果集。说明 空结果集与空值不同。对于可滚动游标,在存储过程执行结束时,结果集中的所有行均会返回给调用批处理、存储过程或触发器。返回时,游标保留在过程中最后一次执行提取时的位置。对于任意类型的游标,如果游标关闭,则将空值

22、传递回调用批处理、存储过程或触发器。如果将游标指派给一个参数,但该游标从未打开过,也会出现这种情况。说明 关闭状态只有在返回时才有影响。例如,可以在过程中关闭游标,稍后再打开游 标,然后将该游标的结果集返回给调用批处理、存储过程或触发器。临时存储过程 SQLServer 支持两种临时过程:局部临时过程和全局临时过程。局部临时过程只能由创 建该过程的连接使用。全局临时过程则可由所有连接使用。局部临时过程在当前会话结束 时 自动除去。全局临时过程在使用该过程的最后一个会话结束时除去。通常是在创建该过程的 会话结束时。临时过程用#和#命名,可以由任何用户创建。创建过程后,局部过程的所有者是唯 一可以

23、使用该过程的用户。执行局部临时过程的权限不能授予其他用户。如果创建了全局临 时过 程,则所有用户均可以访问该过程,权限不能显式废除。只有在 tempdb 数据库中具有 显式CREATE PROCEDURE限的用户,才可以在该数据库中显式创建临时过程(不使用编号 符命名)。可以授予或废除这些过程中的权限。说明 频繁使用临时存储过程会在 tempdb 中的系统表上产生争用,从而对性能产生负 面影响。建议使用 sp_executesql 代替。sp_executesql 不在系统表中存储数据,因此可以 避免这一问题。自动执行存储过程 SQLServer 启动时可以自动执行一个或多个存储过程。这些存储

24、过程必须由系统管理员 创建,并在 sysadmin 固定服务器角色下作为后台过程执行。这些过程不能有任何输入参数。对启动过程的数目没有限制,但是要注意,每个启动过程在执行时都会占用一个连接。如果必须在启动时执行多个过程,但不需要并行执行,则可以指定一个过程作为启动过程,让该过程调用其它过程。这样就只占用一个连接。在启动时恢复了最后一个数据库后,即开始执行存储过程。若要跳过这些存储过程的执 行,请将启动参数指定为跟踪标记 4022。如果以最低配置启动 SQL Server(使用-f 标记),则启动存储过程也不会执行。若要创建启动存储过程,必须作为 sysadmin 固定服务器角色的成员登录,并在

25、 master 数据库中创建存储过程。使用 sp_procoption 可以:将现有存储过程指定为启动过程。停止在 SQL Server 启动时执行过程。提供了姓名)、出版的书籍以及出版社。P)查看 SQL Server 启动时执行的所有过程的列表。存储过程嵌套 存储过程可以嵌套,即一个存储过程可以调用另一个存储过程。在被调用过程开始执行 时,嵌套级将增加,在被调用过程执行结束后,嵌套级将减少。如果超出最大的嵌套级,会 使整个调用过程链失败。可用 NESTLEVE函数返回当前的嵌套级。若要估计编译后的存储过程大小,请使用下列性能监视计数器。*各种分类的高速缓存对象均可以使用这些计数器,包括特殊

26、 sql、准备 sql、过程、触发器等。sql_statement 限制 除了 SET SHOWPLAN_TEX和SET SHOWPLAN_ALt外(这两个语句必须是批处理中仅有 的语句),任何 SET 语句均可以在存储过程内部指定。所选择的 SET 选项在存储过程执行过 程中有效,之后恢复为原来的设置。如果其他用户要使用某个存储过程,那么在该存储过程内部,一些语句使用的对象名必 须使用对象所有者的名称限定。这些语句包括:ALTER TABLE CREATE INDEX CREATE TABLE 所有 DBCC 语句 DROP TABLE DROP INDEX TRUNCATE TABLE U

27、PDATE STATISTICS 权限 CREATE PROCEDURE权限默认授予 sysadmi n 固定服务器角色成员和 db_ow ner和 db_ddladmin 固定数据库角色成员。sysadmin 固定服务器角色成员和 db_owner 固定数据库 角色成员可以将CREATE PROCEDURE限转让给其他用户。执行存储过程的权限授予过程的 所有者,该所有者可以为其它数据库用户设置执行权限。示例 A.使用带有复杂 SELECT 语句的简单过程 下面的存储过程从四个表的联接中返回所有作者 该存储过程不使用任何参数。USE pubs IF EXISTS(SELECT name FRO

28、M sysobjects au_info_all AND t DROP PROCEDURE au_info_all GO CREATE PROCEDURE au_info_all AS SELECT au_lname,au_fname,title,pub_name FROM authors a INNER JOIN titleauthor ta ON a.au_id=ta.au_id INNER JOIN titles t ON t.title_id=ta.title_id INNER JOIN publishers ON t.pub_id=p.pub_id GO 查询学生信息。要 au_in

29、fo_all 存储过程可以通过以下方法执行:EXECUTE au_info_all-Or EXEC au_info_all 如果该过程是批处理中的第一条语句,则可使用:au_info_all 存储过程的一些例子:定义一个带输入参数的存储过程,实现功能:根据家乡、性别、姓氏 求:3个参数,其中家乡、姓氏要求模糊查找,性别默认为 男 例如:查询湖北 的,姓王 的男同学 查询 河南 的,姓马 的女 同学 create proc pk_4(jiaxiang varchar(10),xingshi varchar(8),xingbie char(2)=男 )as select*from n2d09003

30、 where 家乡 like jiaxiang+%and 姓名 like xingshi+%and 性别=xingbie exec pk_4 jiaxiang=湖北,xingshi=王 exec pk_4 jiaxiang=河南,xingshi=马,xingbie=女 定义一个带参数的存储过程,实现:根据输入的编号,修改该学生姓名。例如:输入 42,张三 就把编号为 42的学生姓名修改为张三 alter proc pr(编号 int=42,姓名 char(8)as update N2D09003 set 姓名=姓名 where 编号=编号 go update N2D09003 set 姓名=张

31、三 where 编号=1 exec pr 2,李四 select*from n2d09003 -带输出参数的存储过程 1:查询李四的宿舍号码,并输出 alter proc pr_output1(name varchar(20),-输入类型的 参数 haoma varchar(20)output-定义该参数为输出类型)as/*特别注意:每个输出参数必须赋值*/set haoma=(select 宿舍 from n2d09003 where 姓名=name)-给输出参数赋值 go 2:调用带输出参数的存储过程-定义一个空的变量 declare i varchar(20)-调用存储过程 exec p

32、r_output1 常 勇,i output-显示结果 select i 3:定义一个存储过程,实现一个两数相加的功能 create proc pr_sum(x int,-输入参数 y int,-输入参数 z int output-输出参数)as set z=x+y go declare s int exec pr_sum 5,105,s output select s as 结果 -有返回值的存储过程/*有返回值的存储过程 只能返回整型*/1:输入姓名,返回该学生的编号 create proc pr_return1(name varchar(20)-输入参数)as return(select

33、 编号 from n2d09003 where 姓名=name)go -调用有返回值的存储过程 declare id int exec id=pr_return1 李四 select id as 编号 create proc pr_output2(name varchar(20),bianhao int output)as set bianhao=(select 编号 from n2d09003 where 姓名=name)go 例 2:输入姓名,返回家乡 错误,因为家乡是字符型,而 return 只能返回 int create proc pr_return2(name varchar(20)as return(select 家乡 from n2d09003 where 姓名=name)go declare jiaxiang varchar(20)exec jiaxiang=pr_return2 李四 select jiaxiang as 家乡

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > PPT文档

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com