创建与执行存储过程

存储过程是一组预先编辑好的SQL语句组成,编译后存储在数据库中。

存储过程可包含程序流、逻辑及对数据库的查询。它们可以接受参数、输出参数、返回单个或者多个结果集及返回值。

存储过程分三大类:用户定义的存储过程、扩展存储过程、系统存储过程。


一、用户定义的存储过程

该种存储过程是指封装了可重用代码的模块或者例程。存储过程可以接受输入参数、向客户端返回表格或者标量结果和消息。调用数据定义语言(DDL)和数据操纵语言(DML)语句,然后返回输出参数。创建自定义存储过程时,存储过程名前加上“##”表示创建了一个全局的临时存储过程;存储过程名前加上“#”,表示创建的局部临时存储过程。局部临时存储过程只能在创建它的回话中使用,会话结束时,将被删除。这两种存储过程都存储在tempdb数据库中。

用户定义的存储过程有两种类型:T-SQL或者CLR.

T-SQL:存储过程是指保存的T-SQL语句集合,可以接受和返回用户提供的参数。例如,存储过程中可能包含根据客户端应用程序提供的信息在一个或者多个表中插入新行所需的语句。存储过程也可能从数据库向客户端应用程序返回数据。

CLR: 存储过程是指引用Microsoft.NET Framework公共语言的方法存储过程,可以接受和返回用户提供的参数,它们在.NET Framework程序集是作为类的公共静态方法实现的。

二、扩展存储过程

扩展存储过程允许使用编程语言(例如C)创建自己的外部例程。扩展存储过程是以在SQL Server环境外执行的动态连接(DLL文件)来实现的,可以加载到SQL Server实例运行的地址空间中执行,扩展存储过程可以用SQL Server扩展存储过程API编程,扩展存储过程以 前缀“xp_”来标识,对于用户来说,扩展存储过程和普通存储过程一样,可以用相同的方法来执行。

三、系统存储过程

系统存储过程是SQL Server系统自身提供的存储过程,可以作为命令执行各种操作。

系统存储过程主要用来从系统表中获取信息,使用系统存储过程完成数据库服务器的管理工作,为系统管理员提供帮助,为用户查看数据库对象提供方便,系统存储过程位于数据库服务器中。例如,sys.sp_changedbowner 就是一个系统存储过程。从物理意义上讲,系统存储过程存储在源数据库中,并以“sp_”开头。从逻辑意义上来讲,系统存储过程出现在每个系统定义数据库和用户定义数据库的sys构架中。可将GRANT、DENY 和REVOKE权限应用于系统存储过程。

图1
图2

注意:虽然SQL Server 2008中的系统存储过程被放在master数据库中,但是仍可以在其他数据库中对其进行调用,而且在调用时不必在存储过程名前加上数据库名。甚至当创建一个新数据库时,一些系统存储过程会在新数据库中被自动创建。

图3
图4

例如:sp_databases --列出当前系统中的所有数据库

图5

例如:sp_renamedb  --更改数据库的名称

图6

如图7,将原有的dataBase数据库更改为Hotel数据库。结果如图8.

图7
图8

不带参数,直接写数据库名称,如图9

图9

例如:sp_help --查看表中的所有信息

图10

注意:如图10,我们看到消息版中,告诉我们数据库“master”中不存在或对于此操作无效,发现我们要查询的表不在master数据库中。如图11:

图11

以上是常用的系统存储过程。


接下来,简单说一下扩展存储过程,如图12.通过扩展存储过程在D盘下创建myFile文件夹。

图12

结果如下:

图13



                                                      存储过程的特点


接受输入参数并以输出参数的格式向调用过程或者批处理返回多个值。

包含用于在数据库中执行操作(包括调用其他过程)的编程语句。

向调用过程或者批处理返回状态值,以指明成功或者失败(以及失败的原因)。

存储过程的优点:

1、存储过程加快系统运行速度,存储过程在创建时已经被编译,以后每次执行时不需要重新编译。

2、存储过程可以封装复杂的数据库操作,简化操作流程,例如对多个表的更新,删除等。

3、可实现模块化的程序设计,存储过程可以多次调用,提供统一的数据库访问接口,改进应用程序的可维护性。

4、存储过程可以增加代码的安全性,对于用户不能直接操作存储过程中引用的对象,SQL Server可以设定用户对指定存储过程的执行权限。用户只需提交存储过程名称就可以直接执行,避免了攻击者非法截取SQL代码获得用户数据的可能性。

5、存储过程可以降低网络流量,存储过程代码直接存储于数据库中,在客户端与服务器的通信过程中,不会产生大量的T-SQL代码流量。一个需要数百行SQL语句代码的操作可以通过一条执行过程代码来执行,而不需要在网络中发送数百行代码

存储过程的缺点:

1、数据库移植不方便,存储过程依赖与数据库管理系统,SQL Server存储过程中封装的操作代码不能直接移植到其他的数据库管理系统中。

2、不支持面向对象的设计,无法采用面向对象的方式将逻辑业务进行封装,甚至形成通用的可支持服务的业务逻辑框架。

3、代码可读性差,不易维护。不支持集群。


                                                          设计存储过程


在创建存储过程之前,必须先设计存储过程。在设计存储过程中,需要了解存储过程的创建规则、存储过程内部名称以及加密过程等相关知识。

一、创建存储过程的规则

(1)CREATE PROCEDURE定义自身可以包括任意数量和类型的SQL语句,但图5中的语句除外。因为不能在存储过程的任何位置使用这些语句。

图14

(2)可以引用在同一存储过程中创建的对象,只要引用时已经创建了该对象即可。

(3)可以在存储过程内引用临时表。

(4)如果在存储过程内创建本地临时表,则临时表仅为该存储过程而存在;退出该存储过程后,临时表将消失。

(5)如果执行的存储过程将调用另一个存储过程,则被调用的存储过程可以访问由第一个存储过程创建的所有对象,包括临时表在内。

(6)如果执行对远程Microsoft SQL Server 2008 实例进行更改的远程存储过程,则不能回滚这些更改。远程存储过程不参与事务处理。

(7)存储过程中的参数的最大数目为2100.

(8)存储过程中的局部变量的最大数目仅受可用内存的限制。

(9)根据可用内存的不同,存储过程最大可达128MB。

二、限定存储过程内的名称

在存储过程内,如果用于语句(例如SELECT、INSERT)的对象名没有限定架构,则架构将默认为该存储过程的架构。在存储过程内,如果创建该存储过程的用户没有限定SELECT、INSERT、UPDATE或者DELETE语句中引用的表名或者视图名,则默认情况下,通过该存储过程对这些表进行的访问将受到该过程创建者的权限的限制。

三、加密存储过程的定义

如果要创建存储过程,并且希望确保其他用户无法查看该过程的定义,则可以使用WITHENCRYPTION子句。这样,过程定义将以不可读的形式存储。

注:存储过程一旦被加密,其定义将无法解密,任何人(包括该存储过程的所有者或者系统管理员)都将无法查看该存储过程的定义。


创建存储过程


创建不带参数的存储过程

CREATE PROC / PROCEDURE 存储过程名      //存储过程名称在架构中必须是唯一的。

AS

     SQL语句

GO

图15

创建带参数的存储过程

CREATE PROC / PROCEDURE 存储过程名

       @参数1  数据类型=默认值,

       ....... 

       @参数n  数据类型=默认值 

AS

    SQL语句

GO

图16

带参数的存储过程我们创建完成,刷新数据库,就可以看到我们创建好的存储过程。那么我们如何查询执行带参数的存储过程呢?

以上面的为例,第一种查询执行带参数的存储过程:如图一17

图17

第二种方式:如图--18

图18

第三种方式:--如图19

图19

这里我们需要注意的是:

上例结束时间我们设为默认default时,点击执行,消息版中报错。显示必须传递参数3。如果我们前面的参数是以@name=value的形式传递值的,那所有的参数都必须是这样的形式来传递。如图20

图20





一般,操作最简洁明了的是找到创建好的存储过程,单击右键-->执行存储过程


图21

如图22.可以在红框内根据参数,输入想要查询的存储过程信息,点击确定即可。

图22






最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容