精华内容
下载资源
问答
  • 存储过程什么时候用

    2015-02-02 14:55:22
    存储过程一般用于处理比较复杂的任务,基础ms这个平台,可以大大降低耗时,其编译机制也提高了数据库执行速度。 当然在系统控制方便方面,例如当系统进行调整时,这是只需要将后台存储过程进行更改,而不需要更改...

    存储过程一般用于处理比较复杂的任务,基础ms这个平台,可以大大降低耗时,其编译机制也提高了数据库执行速度。

    当然在系统控制方便方面,例如当系统进行调整时,这是只需要将后台存储过程进行更改,而不需要更改客户端程序。也无需重新安装客户端应用程序。

    存储过程不仅仅适用于大型项目,对于中小型项目,使用存储过程也是非常有必要的。其威力和优势主要体现在:
      1.
    存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

    (这涉及到原理性的问题,你记住就好!)
      2.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 SQL 语句,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了。

    (尽可能少的连接数据库,可以减少时间损耗;事务方面在批量操作中非常重要,因为事务可以回溯,当出错时,可以进行回溯,保证数据的完整性!)
      3.存储过程可以重复使用,可减少数据库开发人员的工作量。

    (体现在分页存储过程,以及下面这个例子:)

    例子:create PROC [dbo].[jobs_public_select]

    @TableName VARCHAR(2000),/*表名*/

    @ParamName VARCHAR(2000),/*查询字段字符串*/

    @ParamWhere NVARCHAR(2000)/*条件字符串*/

    AS

    BEGIN

       Declare @SQL varchar(500)

       set @SQL='SELECT '+@ParamName+' from '+@TableName+'  WHERE  1=1'

       IF @ParamWhere<>''

       BEGIN

          SET @SQL=@SQL+@ParamWhere

       END

       exec(@SQL)

    END

    (这个例子主要作用就是公共查询功能,你只需要传递表名,查询的字段,条件即可。你可以以此类推,写个公共删除,公共更新的;操作无非也这几种哈。)

      4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。

    (这方面在赋权限,主要体现在,连接时采用哪个用户连接数据库,而对应的这个用户也有对应的数据库操作权限。)

    优点:
    1.
    速度快。尤其对于较为复杂的逻辑,减少了网络流量之间的消耗
    我有的过程和函数达到了几百行,一个微型编译器,相信用程序就更麻烦了。

    (在获取权限那个存储过程深有体会,你也可以写个C#的算法,然后与存储过程进行速度比较。)
    2.写程序简单,采用存储过程调用类,调用任何存储过程都只要1-2行代码。
    (
    我不知道别人怎么调用,我是深受其益)
    3.升级、维护方便(你只需要更改存储过程就好,比如添加一个字段等)
    4.调试其实也并不麻烦,可以用查询分析器(基础好,一般没有遇到很大的错误!)
    5.
    如果把所有的数据逻辑都放在存储过程中,那么asp.net只需要负责界面的显示阿什么的,出错的可能性最大就是在存储过程。我碰到的就一般是这种情况。

    (减少了排错的时间)

    缺点:
    1.
    可移植性差,我一直采用sql server开发,可是如果想卖自己的东西,发现自己简直就是在帮ms卖东西,呵呵。想换成mysql,确实移植麻烦。
    2.
    采用存储过程调用类,需要进行两次调用操作,一次是从sql server中取到过程的参数信息,并且建立参数;第二次才是调用这个过程。多了一次消耗。
    不过这个缺点可以在项目开发完成,过程参数完全确定之后,把所有过程参数信息倒入到一个xml文件中来提高性能。

    当一个业务同时对多个表进行处理的时候采用存储过程比较合适。

    1.                             使用存储过程在一般情况下会提高性能,因为数据库优化了存储过程的数据访问计划并应用缓存方便以后的查询;

    2.                             存储过程单独保护存在于数据库中。客户端可以获取权限执行存储过程,而不需要对底层的具体表设置其他的访问权限;

    3.                             存储过程会使得维护起来更加方便,因为通常修改一个存储过程要比在一个已经发布的组件中修改SQL语句更加方便;

    4.                             存储过程给底层数据格式增添了额外的抽象层。使得使用存储过程的客户端对存储过程的实现细节以及对底层数据格式是隔离独立的;

    5.                             存储过程能够缓解网络带宽,因为可以批量执行SQL语句而不是从客户端发送超负载的请求。

    复杂的数据处理用存储过程,如有些报表处理

    多条件多表联合查询,并做分页处理

    总结:

    1.             当一个事务涉及到多个SQL语句时或者涉及到对多个表的操作时就要考虑用存储过程;

    2.             当在一个事务的完成需要很复杂的商业逻辑时(比如,对多个数据的操作,对多个状态的判断更改等)要考虑;

    3.             还有就是比较复杂的统计和汇总也要考虑,但是过多的使用存储过程会降低系统的移植性。

    分页例子:

    create procedure [dbo].[sp_super_page]

    @TableName varchar(5000), --要进行分页的表,也可以用联接,如dbo.employeedbo.employee INNER JOIN dbo.jobs ON (dbo.employee.job_id=dbo.jobs.job_id)

    @Fields varchar(5000), --表中的字段,可以使用*代替

    @OrderField varchar(5000), --要排序的字段

    @sqlWhere varchar(5000), --WHERE子句

    @pageSize int, --分页的大小

    @pageIndex int, --要显示的页的索引

    @TotalPage int output, --页的总数

    @TotalRecords int output--信息总条数

    as

    begin

        Begin Tran

        Declare @sql nvarchar(4000);

        Declare @totalRecord int; --记录总数

        if (@sqlWhere IS NULL or @sqlWhere = '')

           --在没有WHERE子句的情况下得到表中所有的记录总数

           set @sql = 'select @totalRecord = count(*) from ' + @TableName

        else

           --利用WHERE子句进行过滤

           set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' where ' + @sqlWhere

        --执行sql语句得到记录总数

        EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT

        select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)

        --根据特定的排序字段为为行分配唯一ROW_NUMBER的顺序

        if (@sqlWhere IS NULL or @sqlWhere = '')

           set @sql = 'select * from (select ROW_NUMBER() over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName

        else

           set @sql = 'select * from (select ROW_NUMBER() over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName + ' where ' + @SqlWhere

        --确保当前页的索引在合理的范围之内

        if @PageIndex<=0

           Set @pageIndex = 1

        if @pageIndex>@TotalPage

           Set @pageIndex = @TotalPage

     

        --得到当前页在整个结果集中准确的ROW_NUMBER

        Declare @StartRecord int

        Declare @EndRecord int

        set @StartRecord = (@pageIndex-1)*@PageSize + 1

        set @EndRecord = @StartRecord + @pageSize - 1

        --输出当前页中的数据

        set @Sql = @Sql + ') as t' + ' where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' +   Convert(varchar(50),@EndRecord)

        Exec(@Sql)

        If @@Error <> 0

           Begin

               RollBack Tran

               SET @TotalRecords=-1

           End

        Else

           Begin

               Commit Tran

               SET @TotalRecords=@totalRecord

           End   

    end

    展开全文
  • 什么时候用存储过程什么时候用触发器,他们之间的区别【详解】谢谢!! 

    什么时候用存储过程什么时候用触发器,他们之间的区别【详解】谢谢!!

     

    展开全文
  • 初来咋到,经验尚浅,一菜鸟接触数据库不久,知道数据库中视图、触发器和存储过程的概念,可就是不知什么地方应该,不用不可以吗?请指教!
  • 为什么要用存储过程 什么时候用存储过程 存储过程的优点

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

    也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                   

     

     

    为什么要用存储过程 

     

     

     

    几个去 IBM 面试的兄弟回来抱怨:去了好几个不同的 IBM 项目组,几乎每个面试官问到数据库的时候都要问用没用过存储过程,烦人不?大家去面的程序员,又不是 DBA,以前的项目都没有用到存储,不照样运行的好好的?

    存储过程真的那么重要吗,它到底有什么好处呢?

    笔者认为,存储过程说白了就是一堆 SQL 的合并。中间加了点逻辑控制。

    但是存储过程处理比较复杂的业务时比较实用。
    比如说,一个复杂的数据操作。如果你在前台处理的话。可能会涉及到多次数据库连接。但如果你用存储过程的话。就只有一次。从响应时间上来说有优势。
    也就是说存储过程可以给我们带来运行效率提高的好处。
    另外,程序容易出现 BUG 不稳定,而存储过程,只要数据库不出现问题,基本上是不会出现什么问题的。也就是说从安全上讲,使用了存储过程的系统更加稳定。

    数据量小的,或者和钱没关系的项目不用存储过程也可以正常运作。mysql 的存储过程还有待实际测试。如果是正式项目,建议你用 sql server 或 oracle 的存储过程。数据与数据之间打交道的话,过程会比程序来的快的多。面试官问有没有用存储,实际上就是想知道前来面试的程序员到底做过数据量大的项目没。如果是培训出来的,或者小项目小公司出来的,对存储肯定接触的少了。

    所以,要想进大公司,没有丰富存储过程经验,是不行的。

    那么什么时候才可以用存储?对于数据量不是很大以及业务处理不是很复杂的小项目就无需要了么?
    错。存储过程不仅仅适用于大型项目,对于中小型项目,使用存储过程也是非常有必要的。其威力和优势主要体现在:
      1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
      2.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 SQL 语句,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了。
      3.存储过程可以重复使用,可减少数据库开发人员的工作量。
      4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。

               

    给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

    这里写图片描述
    展开全文
  • 函数限制比较多,如不能临时表,只能表变量等,而存储过程的限制相对就比较少。1. 一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。2. 对于存储过程来说可以返回参数,而函数只能...

    核心提示:本质上没区别。只是函数有限制只能返回一个标量,而存储过程可以返回多个。并且函数是可以嵌入在SQL中使用的,可以在SELECT等SQL语句中调用,而存储过程不行。执行的本质都一样。

    函数限制比较多,如不能用临时表,只能用表变量等,而存储过程的限制相对就比较少。

    1. 一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。

    2. 对于存储过程来说可以返回参数,而函数只能返回值或者表对象。

    3. 存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一个部分来调用,由于函数

    可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。

    4. 当存储过程和函数被执行的时候,SQL Manager会到procedure cache中去取相应的查询语句,如果在

    procedure cache里没有相应的查询语句,SQL Manager就会对存储过程和函数进行编译。

    Procedure cache:中保存的是执行计划,当编译好之后就执行procedure cache中的execution plan,之后SQL SERVER会根据每个execution plan的实际情况来考虑是否要在cache中保存这个plan,评判的标准一个是这个execution plan可能被使用的频率;其次是生成这个plan的代价,也就是编译的耗时。保存在cache中的plan在下次执行时就不用再编译了。

    存储过程和函数具体的区别:

    存储过程:可以使得对的管理、以及显示关于及其用户信息的工作容易得多。存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。

    可以出于任何使用 SQL 语句的目的来使用存储过程,它具有以下优点:

    (1)功能强大,限制少。

    (2)可以在单个存储过程中执行一系列 SQL 语句。

    (3)可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。

    (4)存储过程在创建时即在上进行编译,所以执行起来比单个 SQL 语句快。

    (5)可以有多个返回值,即多个输出参数,并且可以使用SELECT返回结果集。

    函数:是由一个或多个 SQL 语句组成的子程序,可用于封装代码以便重新使用。自定义函数诸多限制,有许多语句不能使用,许多功能不能实现。函数可以直接引用返回值,用表变量返回记录集。但是,用户定义函数不能用于执行一组修改全局数据库状态的操作。

    补充:

    前面有一句,“可以处于任何使用SQL语句的目的来使用存储过程”。这里想说的是,有些时候有些地方使用函数或许会更方便些。例如,存在这样一个表:Temperature(Year, Month, Day, T02, T08, T14, T20),其中Year,Month,Day是时间字段,T02, T08, T14, T20是指2时、8时、14时、20时四个时刻对应的温度值,这些温度值可为空。现在,要求统计2008年5月份的平均温度。

    或许大家会这样写:

    SELECT (AVG(T02)+AVG(T08)+AVG(T14)+AVG(T20))/4 FROM Temperature WHERE Year=2008 AND Month=5

    如果不考虑空值的话,这样完全正确,但是考虑空值的话,如果根本没有统计02时的温度,那么AVG(T02)将为NULL,然后进行所有运算的结果都将为NULL。这显然是不正确的。

    这里可以创建一个自定义函数,然后使用一个SELECT语句即可查询:

    SELECT AVG(user.Average(T02,T08,T14,T20)) FROM Temperature WHERE Year=2008 AND Month=5

    总结:

    用户自定义函数在处理同一数据行中的各个字段时,特别方便有用。虽然这里使用存储过程也能达到查询目的,但是显然没有使用函数方便。而且,即使使用存储过程也无法处理SELECT查询中的同一数据行中的各个字段的运算。因为存储过程不返回值,使用时只能单独调用;而函数却能出现在能放置表达式的任何位置。

    CREATE FUNCTION user.Average

    (

    @T02 float,

    @T08 float,

    @T14 float,

    @T20 float

    )

    RETURNS float AS

    BEGIN

    DECLARE @sum float

    DECLARE @num int

    DECLARE @Ret float

    SET @sum=0

    SET @num=0

    IF @T02 IS NOT NULL

    BEGIN

    SET @sum = @sum + @T02

    SET @num = @num + 1

    END

    IF @T08 IS NOT NULL

    BEGIN

    SET @sum = @sum + @T08

    SET @num = @num + 1

    END

    IF @T14 IS NOT NULL

    BEGIN

    SET @sum = @sum + @T14

    SET @num = @num + 1

    END

    IF @T20 IS NOT NULL

    BEGIN

    SET @sum = @sum + @T20

    SET @num = @num + 1

    END

    IF @num>0   SET @Ret = @sum / @num

    Return @Ret

    END

    GO

    展开全文
  • 什么用存储过程 几个去 IBM 面试的兄弟回来抱怨:去了好几个不同的 IBM 项目组,几乎每个面试官问到数据库的时候都要问没用过存储过程,烦人不?大家去面的程序员,又不是 DBA,以前的项目都没有用到存储,不...
  •  几个去 IBM 面试的兄弟回来抱怨:去了好几个不同的 IBM 项目组,几乎每个面试官问到数据库的时候都要问没用过存储过程,烦人不?大家去面的程序员,又不是 DBA,以前的项目都没有用到存储,不照样运行的好好的?...
  • 什么时候用存储过程

    2017-12-22 17:10:41
    1.数据量非常大,不适合数据先移植到程序中,在处理,可以直接在存储过程中处理, 2.数据几乎都是表操作,没有什么复杂的操作, 3.存储过程可以有效的防止注入, 4,当服务器程序员水平不如DBA时候采用存储过程
  • 几个去 IBM 面试的兄弟回来抱怨:去了好几个不同的 IBM 项目组,几乎每个面试官问到数据库的时候都要问没用过存储过程,烦人不?大家去面的程序员,又不是 DBA,以前的项目都没有用到存储,不照样运行的好好的?...
  • 存储过程:为防止恶意注入,对数据库的操作,都使用存储过程; 事务:在存储过程中,如果有对两个以上表的修改,最好使用事务 转载于:https://www.cnblogs.com/xw2cc1314/archive/2013/04/19/3029991.html...
  • 我个人主要在下面的时候用存储过程: 1.需多次访问数据库 2.存在数据逻辑操作比较复杂的查询 3.需同时操作多个表的事务操作
  • 什么时候用存储过程

    千次阅读 2017-08-23 15:00:51
    什么用存储过程 以前的项目都没有用到存储,不照样运行的好好的?存储过程真的那么重要吗,它到底有什么好处呢? 存储过程说白了就是一堆 SQL 的合并。中间加了点逻辑控制。但是存储过程处理...
  • 什么时候用存储过程合适

    千次阅读 2018-01-19 11:42:45
    当一个事务涉及到多个SQL语句时或者涉及到对多个表的操作时就要考虑用存储过程;当在一个事务的完成需要很复杂的商业逻辑时(比如,对多个数据的操作,对多个状态的判断更改等)要考虑;还有就是比较复杂的统计和...
  • 存储过程一般用于处理比较复杂的任务,基础ms这个平台,可以大大降低耗时,其编译机制也提高了数据库执行速度。 当然在系统控制方便方面,例如当系统进行调整时,这是只需要将后台存储过程进行更改,而不需要更改...
  • 什么时候需要用存储过程

    千次阅读 2011-03-29 14:43:00
    2、什么时候需要用存储过程  如果服务器定义了存储过程,应当根据需要决定是否要用存储过程存储过程通常是一些经常要执行的任务,这些任务往往是针对大量的记录而进行的。在服务器上执行存储过程
  • 当一个事务涉及到多个SQL语句时或者涉及到对多个表的操作时就要考虑用存储过程;当在一个事务的完成需要很复杂的商业逻辑时(比如,对多个数据的操作,对多个状态的判断更改等)要考虑;还有就是比较复杂的统计和汇总...
  • 几个去 IBM 面试的兄弟回来抱怨:去了好几个不同的 IBM 项目组,几乎每个面试官问到数据库的时候都要问没用过存储过程,烦人不?大家去面的程序员,又不是 DBA,以前的项目都没有用到存储,不照样运行的好好的? ...
  • 什么时候用存储过程+分页例子

    千次阅读 2016-08-02 16:00:53
    存储过程一般用于处理比较复杂的任务,基础ms这个平台,可以大大降低耗时,其编译机制也提高了数据库执行速度。 当然在系统控制方便方面,例如当系统进行调整时,这是只需要将后台存储过程进行更改,而不需要更改...
  • 什么存储过程存储过程可以说是一个记录集吧,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候...
  • 面试中有时候会问:存储过程什么用?看了今天的知识,你就知道如何回答了。1.存储过程什么?假如你每天要开车完成一些列重复的操作:车钥匙启动车,倒车。现在出现了一款新车,可以自动的完成这些重复的工作。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,490
精华内容 596
关键字:

存储过程什么时候用