首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 详谈存储过程 [已结贴,结贴人:xiaofei88929]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-11 21:04:17 楼主
        存储过程相当的重要,而我现在也是深深的感觉到了,希望我现在的学习为时不晚.


    大家把自己知道的关于存储过程的都说出来啊!彼此共同探讨学习下,共同进步!
    50  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-11 21:06:351楼 得分:0
    过程就是语句的结合,免便宜,速度开
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-11 21:08:452楼 得分:0
      呵呵,你说的有点简单了,对于我们这些学根不扎实的人来说听不懂得哦!我发布这个是重在讨论,让大家都清清楚楚的知道存储过程.彼此之间互相共同学习.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-11 21:12:233楼 得分:0
    晕,就几个字打错好几个
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-11 22:08:384楼 得分:0
    存储过程预编译,快
    数据库移植,传说比较KB

    楼下继续
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-11 22:10:405楼 得分:20
    联机丛书上有很多,随便列几个:

    系统存储过程 (Transact-SQL)
    http://technet.microsoft.com/zh-cn/library/ms187961.aspx


    sp_addgroup
    在当前的数据库中创建一个组。为了向后兼容性,将 sp_addgroup 包含在其中。Microsoft® SQL Server™ 7.0 版使用角色而不是组。使用 sp_addrole 添加一个角色。

    sp_addlogin
    创建新的 Microsoft® SQL Server™ 登录,使用户得以连接使用 SQL Server 身份验证的 SQL Server 实例。

    sp_addrole
    在当前数据库创建新的 Microsoft® SQL Server™ 角色。

    sp_addtype
    创建用户定义的数据类型。

    sp_adduser
    为当前数据库中的新用户添加安全帐户。包括此过程是为了向后兼容。请使用 sp_grantdbaccess。

    sp_bindefault
    将默认值绑定到列或用户定义的数据类型。

    sp_bindrule
    将规则绑定到列或用户定义的数据类型。

    sp_dbfixedrolepermission
    显示每个固定数据库角色的权限。

    sp_dropgroup
    从当前数据库中删除角色。提供 sp_dropgroup 是为了向后兼容。在 Microsoft® SQL Server™ 7.0 版中,组作为角色来实现。

    sp_droprole
    从当前数据库删除 Microsoft® SQL Server™ 角色。

    sp_droptype
    从 systypes 删除用户定义的数据类型。

    sp_dropuser
    从当前数据库中删除 Microsoft® SQL Server™ 用户或 Microsoft Windows NT® 用户。提供 sp_dropuser 是为了向后兼容。使用 sp_revokedbaccess 删除用户。

    sp_help
    报告有关数据库对象(sysobjects 表中列出的任何对象)、用户定义数据类型或 Microsoft® SQL Server™ 所提供的数据类型的信息。

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

    sp_helpdbfixedrole
    返回固定数据库角色的列表。

    sp_who
    提供关于当前 Microsoft® SQL Server™ 用户和进程的信息。可以筛选返回的信息,以便只返回那些不是空闲的进程。

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-11 22:14:556楼 得分:10
    关于存储过程的优点
    http://www.ebookit.cn/767.html
    存储过程是由一些SQL语句和控制语句组成的被封装起来的过程,它驻留在数据库中,可以被客户应用程序调用,也可以从另一个过程或触发器调用。它的参数可以被传递和返回。与应用程序中的函数过程类似,存储过程可以通过名字来调用,而且它们同样有输入参数和输出参数。

      根据返回值类型的不同,我们可以将存储过程分为三类:返回记录集的存储过程, 返回数值的存储过程(也可以称为标量存储过程),以及行为存储过程。顾名思义,返回记录集的存储过程的执行结果是一个记录集,典型的例子是从数据库中检索出符合某一个或几个条件的记录;返回数值的存储过程执行完以后返回一个值,例如在数据库中执行一个有返回值的函数或命令;最后,行为存储过程仅仅是用来实现数据库的某个功能,而没有返回值,例如在数据库中的更新和删除操作。

      使用存储过程的好处

      相对于直接使用SQL语句,在应用程序中直接调用存储过程有以下好处:

      (1)减少网络通信量。调用一个行数不多的存储过程与直接调用SQL语句的网络通信量可能不会有很大的差别,可是如果存储过程包含上百行SQL语句,那么其性能绝对比一条一条的调用SQL语句要高得多。

      (2)执行速度更快。有两个原因:首先,在存储过程创建的时候,数据库已经对其进行了一次解析和优化。其次,存储过程一旦执行,在内存中就会保留一份这个存储过程,这样下次再执行同样的存储过程时,可以从内存中直接调用。

      (3)更强的适应性:由于存储过程对数据库的访问是通过存储过程来进行的,因此数据库开发人员可以在不改动存储过程接口的情况下对数据库进行任何改动,而这些改动不会对应用程序造成影响。

      (4) 分布式工作:
    应用程序和数据库的编码工作可以分别独立进行,而不会相互压制。


    msdn上面相关的说明


    考虑使用存储过程的理由
    也许您曾经在多处编写过使用 SqlCommand 对象的 T-SQL,但却从未考虑过是否有一个比将它并入数据访问代码更好的位置。由于应用程序随着时间的推移增添了一些功能,因此其内部可能包含一些复杂的 T-SQL 过程代码。存储过程为封装此代码提供了一个替换位置。

    大多数人可能对存储过程已有所了解,但对于那些不了解存储过程的人员而言,存储过程是指一组作为单个代码单元一起存储于数据库中的 T-SQL 语句。您可以使用输入参数传入运行时信息,并取回作为结果集或输出参数的数据。存储过程在首次运行时将被编译。这将产生一个执行计划 - 实际上是 Microsoft® SQL Server™ 为在存储过程中获取由 T-SQL 指定的结果而必须采取的步骤的记录。然后,执行计划在内存中得到缓存,以备以后使用。这样会改善存储过程的性能,因为 SQL Server 无需为确定如何处理代码而重新分析它,而只需引用缓存的计划即可。这个缓存的计划一直可用,直到 SQL Server 重新启动,或直到它由于使用率较低而溢出内存。

    性能
    缓存的执行计划曾使存储过程较之查询更有性能优势。但对于 SQL Server 的几个最新版本,执行计划已针对所有 T-SQL 批处理进行了缓存,而不管它们是否在存储过程中。因此,基于此功能的性能已不再是存储过程的卖点。任何使用静态语法,且提交频率足以阻止执行计划溢出内存的 T-SQL 批处理将会获得同样的性能好处。“静态”部分是关键;任何更改,即使像添加注释这样无关紧要的更改,也将导致无法与缓存的计划相匹配,从而将无法重复使用计划。

    但是,当存储过程可以用于降低网络流量时,它们仍然能够提供性能好处。您只需在网络中发送 EXECUTE stored_proc_name 语句,而非整个 T-SQL 例程,这可以在复杂操作中广泛使用。设计良好的存储过程可以将客户端与服务器之间的许多往返过程简化为单个调用。

    此外,使用存储过程使您能够增强对执行计划的重复使用,由此可以通过使用远程过程调用 (RPC) 处理服务器上的存储过程而提高性能。使用 StoredProcedure 的 SqlCommand.CommandType 时,存储过程通过 RPC 执行。RPC 封装参数和调用服务器端过程的方式使引擎能够轻松地找到匹配的执行计划,并只需插入更新的参数值。

    考虑使用存储过程提高性能时,最后要考虑是否要充分利用 T-SQL 的优点。请考虑要如何处理数据。

    • 是否要使用基于集合的操作,或执行 T-SQL 中完全支持的其他操作?那么存储过程就是一个选择,而内联查询也可以使用。

    • 是否尝试执行基于行的操作,或复杂的字符串处理?那么可能要重新考虑在 T-SQL 中进行这种处理,这不包括使用存储过程,至少要到 Yukon 发布并且公共语言运行库 (CLR) 集成可用后,才能使用存储过程。



    可维护性和抽象
    要考虑的另一个潜在优势是可维护性。理想情况下,数据库架构从不更改,业务规则不被修改,但在现实环境中,情况则完全不同。既然情况如此,那么如果可以修改存储过程以包括新 X、Y 和 Z 表(为支持新的销售活动而添加了这些表)中的数据,而不是在应用程序代码中的某个位置更改此信息,则维护对您来说可能比较容易。在存储过程中更改此信息使得更新对应用程序而言具有透明性 - 您仍然返回相同的销售信息,即使存储过程的内部实现已经更改。更新存储过程通常比更改、测试以及重新部署程序集需要较少的时间和精力。

    另外,通过抽象化实现并将此代码保存在存储过程中,任何需要访问数据的应用程序均可以获取一致的数据。您无需在多个位置维护相同的代码,用户便可获取一致的信息。

    在存储过程中存储 T-SQL 的另一个可维护性优点是更好的版本控制。您可以对创建和修改存储过程的脚本进行版本控制,就像可以对任何其他源代码模块进行版本控制一样。通过使用 Microsoft Visual SourceSafe® 或某个其他源代码控制工具,您可以轻松地恢复到或引用旧版本的存储过程。

    在使用存储过程提高可维护性时应值得注意的一点是,它们无法阻止您对架构和规则进行所有可能的更改。如果更改范围大到需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则您仍需要更新程序集中的代码以添加参数、更新 GetValue() 调用,等等。

    要注意的另一个问题是,由于存储过程将应用程序绑定到 SQL Server,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。如果应用程序的可移植性在您的环境中非常重要,则将业务逻辑封装在不特定于 RDBMS 的中间层中可能是一个更佳的选择。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-11 22:16:597楼 得分:0
    注意事项简单的说就是移植性不好,
    不能移植到方便地其它数据库,
    貌似目前还没有工具可以直接将SQL Server的移植到Oracle 或者My SQL 或者DB2或者 Sybase上面,
    都需要重写,工作量很大.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-11 22:19:038楼 得分:5
    维护方便。嵌入在程序中的SQL语句修改比较麻烦,而且经常不能肯定该改的是不是都改了。SQLSERVER上的存储过程修改就比较方便,直接改掉该存储过程,调用它的程序基本不用动,除非改动比较大(如改了传入的参数,返回的数据等)。

    更安全一点。不会有SQL语句注入问题。

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-11 22:20:299楼 得分:0
    存储过程的优点体现在哪里
    http://topic.csdn.net/u/20070618/19/686b5a88-806a-4e2c-9749-1541deb4c043.html
    大家能否说一写使用存储过程的好处
    http://topic.csdn.net/t/20040910/14/3359963.html
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-11 22:37:2610楼 得分:5
    存储过程基本知识
    http://technet.microsoft.com/zh-cn/library/ms191436.aspx

    在 SQL Server 中使用存储过程而不使用存储在客户端计算机本地的 Transact-SQL 程序的好处包括:

    存储过程已在服务器注册。

    存储过程具有安全特性(例如权限)和所有权链接,以及可以附加到它们的证书。
    用户可以被授予权限来执行存储过程而不必直接对存储过程中引用的对象具有权限。

    存储过程可以强制应用程序的安全性。
    参数化存储过程有助于保护应用程序不受 SQL Injection 攻击。有关详细信息,请参阅 SQL Injection。

    存储过程允许模块化程序设计。
    存储过程一旦创建,以后即可在程序中调用任意多次。这可以改进应用程序的可维护性,并允许应用程序统一访问数据库。

    存储过程是命名代码,允许延迟绑定。
    这提供了一个用于简单代码演变的间接级别。

    存储过程可以减少网络通信流量。
    一个需要数百行 Transact-SQL 代码的操作可以通过一条执行过程代码的语句来执行,而不需要在网络中发送数百行代码
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zzyyc
    • 等级:
    发表于:2008-05-11 22:44:1011楼 得分:0
    路过......
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 09:00:4212楼 得分:0
    Up
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 09:08:2013楼 得分:5
    创建存储过程前,请考虑下列事项:

    CREATE PROCEDURE 语句不能与其他 SQL 语句在单个批处理中组合使用。


    要创建过程,您必须具有数据库的 CREATE PROCEDURE 权限,还必须具有对架构(在其下创建过程)的 ALTER 权限。对于 CLR 存储过程,您必须拥有在 <method_specifier> 中引用程序集或拥有对该程序集的 REFERENCES 权限。


    存储过程是架构作用域内的对象,它们的名称必须遵守标识符规则。


    您只能在当前数据库中创建存储过程。


    创建存储过程时,应指定:

    所有输入参数和向调用过程或批处理返回的输出参数。


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


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


    捕获和处理潜在的错误所需的任何错误处理语句。


    命名存储过程
    Microsoft 强烈建议不要以 sp_ 为前缀创建任何存储过程。sp_ 前缀是 SQL Server 用来指定系统存储过程的。您选择的名称可能会与以后的某些系统过程发生冲突。如果应用程序引用了不符合架构的名称,而您自己的过程名称与系统过程名称相冲突,则该名称将绑定到系统过程而非您自己的过程,这将导致应用程序中断。

    如果用户定义存储过程与系统存储过程名称相同,而且不合法或者符合 dbo 架构,则该存储过程将永不执行,取而代之的是始终执行系统存储过程。下面的示例对此行为进行了演示。

    命名存储过程
    Microsoft 强烈建议不要以 sp_ 为前缀创建任何存储过程。sp_ 前缀是 SQL Server 用来指定系统存储过程的。您选择的名称可能会与以后的某些系统过程发生冲突。如果应用程序引用了不符合架构的名称,而您自己的过程名称与系统过程名称相冲突,则该名称将绑定到系统过程而非您自己的过程,这将导致应用程序中断。

    如果用户定义存储过程与系统存储过程名称相同,而且不合法或者符合 dbo 架构,则该存储过程将永不执行,取而代之的是始终执行系统存储过程。下面的示例对此行为进行了演示。

    USE AdventureWorks;
    GO
    CREATE PROCEDURE dbo.sp_who
    AS
        SELECT FirstName, LastName FROM Person.Contact;
    GO
    EXEC sp_who;
    EXEC dbo.sp_who;
    GO
    DROP PROCEDURE dbo.sp_who;
    GO

    临时存储过程
    专用和全局临时存储过程与临时表类似,都可以通过向该过程名称添加 # 和 ## 前缀的方法进行创建。# 表示本地临时存储过程,## 表示全局临时存储过程。SQL Server 关闭后,这些过程将不复存在。

    SQL Server 的早期版本不支持重用 Transact-SQL 语句或批处理的执行计划,当连接到这些早期版本时,临时存储过程很有用。当连接到 SQL Server 2000 或更高版本的应用程序时,应使用 sp_executesql 系统存储过程,而非临时存储过程。只有创建了本地临时过程的连接才可以执行它。在连接关闭之后,临时过程将被自动删除。

    任何连接都可执行全局临时存储过程。只有创建该过程的用户所用的连接关闭,并且所有其他连接所用的该过程的当前执行版本运行完毕后,全局临时存储过程才不再存在。一旦用于创建该过程的连接关闭,将不再允许启动执行该全局临时存储过程。只允许那些已启动执行该存储过程的连接完成该过程的运行。

    由于 tempdb 会在每次 SQL Server 启动时重新创建,因而,如果在 tempdb 数据库中直接创建了一个不以 # 或 ## 为前缀的存储过程,则当 SQL Server 关闭时,存储过程将被自动删除。在 tempdb 中直接创建的过程在创建它的连接终止后仍然存在。

    注意: 
    过多使用临时存储过程可能会产生对 tempdb 中的系统表的争用,反而会降低性能。建议改为使用 sp_executesql。sp_executesql 不在系统表中存储数据,因而可以避免此问题。

    不能将 CLR 存储过程创建为临时存储过程。

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 09:13:2314楼 得分:0
    up
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ojuju10
    • 等级:
    发表于:2008-05-12 10:32:2115楼 得分:5

    我也补充一下:

    存储过程的数据库移植不是很好,如果更换数据库,所有的存储过程都是要重新写!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 11:40:1116楼 得分:0
    我觉得吧:应该说得简单明了些,那要是能加上些例子的话那就更容易理解了,写了那么长的一大堆东西,谁又耐心去看完阿。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-13 00:07:3717楼 得分:0
    是指对文件的读取操作吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 16:34:3418楼 得分:0
    恩,对,要得就是这个阿!
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    世纪乐知(北京)网络技术有限公司 版权所有 京 ICP 证 020026 号
    Copyright © 2000-2007, CSDN.NET, All Rights Reserved