-- 10.1 存储过程基础 ( P273 )(摘录于 SQL Server 2008实战\第10章_存储过程(P273页)
-- 这几年,我已经形成了一个只要有可能就使用存储过程的强烈偏好。根据我的经验,使用存储过程有很多好处,而没什么坏处。通常,
-- 反对使用存储过程的理由来自某些应用程序开发者,他们更喜欢在应用层使用即席SQL (adhoc SQL),并且没有训练过使用存储过程。与独立的应用程序和数据库管理员一起,
-- 存储过程同样面临着开发人员到数据库管理员对T-SQL代码的失控。假设你们的数据库管理团队很强,并且乐意及时提供向存储过程转移的帮助,
-- 那么使用存储过程的优势会比失去控制大很多。-- 使用存储过程有以下一些好处。
-- *1) 存储过程帮助在数据库层聚集T-SQL代码。嵌入即席SQL的网站或应用程序在应用环境下很难修改,当即席SQL嵌入在应用程序内的时候,你可能会花费太多时间试图找到和调试嵌入的SQL。
-- 一旦找到了bug,你可能就需要重新编译可执行程序,引起不必要的应用程序临时停止或痛苦的应用程序部署。如果把T-SQL集中到存储过程中去,
-- 你就只需要集中在一个地方来查询SQL代码或SQL批处理。如果你能正确地为代码建立文档并对代码标准化,存储过程就会提升整个应用程序的可支持性。
-- *2) 存储过程帮助大的即席查询减少网络流量。编写应用程序调用而不是500行的SQL调用来执行存储过程,对网络以及应用程序的性能有正面影响,特别是当调用在一分钟内重复数千次时。
-- *3) 存储过程促进代码的可利用性。例如,如果你的网站应用程序使用一个下拉菜单来包含一组城市,并且这个下拉菜单用于很多网页,
-- 你可以在每个页面调用存储过程而不是在多个地方嵌入相同的SQL。
-- *4) 存储过程淡化数据获取的方法。如果你修改了提供源数据的基本表,存储过程(和视图相似)能让应用程序对这个修改透明。这样就不需要修改应用程序底层的代码就能修改。
-- 你可以把老的表换成新的,而且只要同样的列和数据类型返回给应用程序,则应用程序完全不知情。
-- *5) 与视图不同,存储过程可以利用流控制技术、临时表、表变量等。
-- *6) 存储过程对查询响应时间的影响比较稳定。如果你使用大量的即席查询,可能会注意到有时候从查询中返回结果所花的时间变化很大。
-- 这可能由诸如对表(锁)的并发活动或者资源问题(内存、CPU)等外部因素引起的。从另外一面来说,即席查询可能执行得不稳定,因为SQL Server有时候会选择效率较低的执行计划。
-- 而存储过程提供了更可靠的查询计划缓存,因此可以重用。注意到,这里我使用的是“可靠”这个单词,而不是“快速”。即席查询有时候确实比存储过程执行得更好,
-- 但是它完全依赖执行计划被缓存的环境(“被发觉”的参数),以及看你怎么测试、调优以及实现代码了。-- 如果前面的这些理由还不能让你相信存储过程是非常好的,那么让我们再来看一下安全方面的好处。直接访问SQL Server实例和它的数据库的表(更坏的情况是访问sysadmin)会引起安全隐患。
-- 内联即席代码特别容易遭受SQL注入(injection)攻击。如果在T-SQL发送到SQL Server实例之前,有害的T-SQL就插入到了既有应用程序的T-SQL代码,那么就会发生SQL注入。除了SQL注入攻击,
-- 如果一些人得到了内联代码,他们就能收集数据库中基础架构的信息,从而指导他们尝试攻击。让所有SQL在存储过程内能保证只有存储过程被应用程序引用----而不是每一个列和表名。-- 存储过程的另外一个安全方面的好处就是可以授予数据库用户和/或数据库角色对它们的访问而不是授予对表的直接访问权限。存储过程能作为控制层,
-- 你可以选择哪些列和行能被存储过程(和调用者)修改,哪些不能。

解决方案 »

  1.   

    固定的不需要维护的短小的sql就没必要写存储过程啊。这个视情况。
      

  2.   

    10.1 存储过程基础 ( P273 )(摘录于 SQL Server 2008实战\第10章_存储过程(P273页)
    -- 这几年,我已经形成了一个只要有可能就使用存储过程的强烈偏好。根据我的经验,使用存储过程有很多好处,而没什么坏处。通常,
      

  3.   

     技术薄弱的,还是用java代码实现业务吧,存储过程要求技术好的人使用,灵活性能强,本人喜欢后者。
      

  4.   

    dz论坛没有使用存储过程不是很好嘛?  楼主不要误导人,OK?
      

  5.   

    - 10.1 存储过程基础 ( P273 )(摘录于 SQL Server 2008实战\第10章_存储过程(P273页)
      

  6.   

    我认为是,能不用存储过程则尽量不用.存储过程是将一些SQL语句组合成一个模块,然后得到想要的结果,如果是这样,不如编写程序来做.
      

  7.   

    以前在电信搞oracle开发,存储过程+函数,用得极多现在转Sqlserver DBA了,不知道存储过程用的频率是不是和oracle用得次数一样多?
    毕竟是两种数据库在线求解
      

  8.   

    学习了.以前都写到一个cs文件里面去.后来发现procedure比较方便
      

  9.   

    procedure的确是好,请问可以传入参数进去吗?
      

  10.   

    有一种说法是存储过程不好维护。至今我还没有想通
    我到希望bug都出在存储过程里,这样修改很方便啊。
      

  11.   

    存储过程,可以看作是SQL端的程序,也可看作中间件.供前端应用软件调用.具有传参少,远行效率高,可复用性,节约网络资源等优点.
      

  12.   

    不足之处,加大SQL 服务器的负荷.
      

  13.   

    不足之处,加大SQL 服务器的负荷.
      

  14.   


    不是 很明白 为什么上面大家都认为存储过程会加大SQL服务器的负荷?我的理解我用.NET 开发 如果直接程序写SQL语句的话,一样要通过ADO.NET内部处理去运行正确的SQL语句,最终还是得调用SQL服务器,使用存储过程只通过少量参数形式 直接传递给数据库直接执行,后者比前者更加大服务器负荷?SQLSERVER数据库 能够缓存静态语句的存储过程的编译计划 下次 同样的调用 就不需要编译了
    处理大并发查询 性能还是能提高很多的
    所以 我觉得 在某种意义上只会减小服务器负荷
    对于SQL语句的使用 个人觉得 在那种 多条件 多判断  多拼接 的复杂业务中 还是很有用的
    如 查询中自选 查询字段、内容、条件 得到客户自己想要的结果个人还是喜欢用存储过程 因为后期的维护比较轻松点。
      

  15.   

    我就喜欢用存储过程。觉得维护方便,不用去动DA层代码。还方便移植,不管DA层是Java还是c#写的。
      

  16.   

    -- 一旦找到了bug,你可能就需要重新编译可执行程序,引起不必要的应用程序临时停止或痛苦的应用程序部署。如果把T-SQL集中到存储过程中去,这点不太同意,一般来说,程序中如果发生了参数的改变,SQL基本上也是必须要进行修改的,很多情况下都是业务决定了是否修改
      

  17.   

    凡事极端就不好,getdate()取服务器时间用存储过程取的见过没?
      

  18.   

    存储过程方便使用,主要还能防止sql注入式攻击呢。
      

  19.   

    假设很强并且乐意?这在实际中的概率有多大?存储过程确实可以解决一些不必要的部署。但如果几个小小的SQL语句都不能保证正确执行然后才部署,我看这程序中的BUG会引起更多的问题。这个确实是存储过程的优点,对于较大且固定的查询(不拼接SQL)逻辑确实不错,可以节约数据传输量与SQL语句解析开销。如果程序架构拥有数据层,这个问题根本就不存在。再说你的举例就应该是典型的缓存应用,而不应该每次都查询数据库。修改存储过程也是修改,修改数据层也是同样的修改,区别应该不大。SQL语句本就不应该有复杂的逻辑控制,多数时候这更应该是程序逻辑。多数时候用数据库实现复杂的逻辑控制比程序实现代价大很多。这点应该纯属忽悠吧!从效率上来说,存储过程相对于SQL也就是节约了预编译和查询网络传输(SQL语句一般都比较存储过程名称占用的空间大很多)而已。至于执行都一样,不稳定的主要因素就是缓存数据。防注入首先要了解为什么会被注入,注入的源头是不可靠的SQL语句拼接,SqlParamtere存在的目的就是减少SQL拼接的。
    使用存储过程并不能保证不被注入,我曾看到过很多拼接SQL的存储过程。这才是存储过程在安全方面的真正优点,不过并不实用。使用存储过程应该搞清楚为什么要使用它,在什么情况下使用它。如果你的数据库管理员并不是那么优秀,就很可能滥用存储过程,滥用存储过程对于服务器来说是恶梦的开始。
    另外要说的是,优秀的程序员一般都不需要数据库管理员,只有他们才真正懂得如何从全局角度权衡与处理程序与数据库之间的关系。