zoukankan      html  css  js  c++  java
  • SQL Server 存储过程 函数 和sql语句 区别

    存储过程与sql语句

    存储过程的优点:
     1.具有更好的性能
       存储过程是预编译的,只在创建时进行编译,以后每次执行存储过程都不需再重新编译,
       而一般 SQL 语句每执行一次就编译一次,因此使用存储过程可以提高数据库执行速度。
     2.功能实现更加灵活
       存储过程中可以应用条件判断和游标等语句,有很强的灵活性,可以直接调用数据库的一些内置函数,完成复杂的判断和较复杂的运算。
     3.减少网络传输
       复杂的业务逻辑需要多条 SQL 语句,当客户机和服务器之间的操作很多时,
       将产生大量的网络传输。如果将这些操作放在一个存储过程中,那么客户机和服务器之间的网络传输就会减少,降低了网络负载。
     4.具有更好的安全性
       (1)数据库管理人员可以更好的进行权限控制,存储过程可以屏蔽对底层数据库对象的直接访问,使用 EXECUTE 权限调用存储过程,无需拥有访问底层数据库对象的显式权限。
       (2)在通过网络调用过程时,只有对执行过程的调用是可见的。无法看到表和数据库对象名称,不能嵌入SQL 语句,有助于避免 SQL 注入攻击。
    存储过程的弊端:
     1.架构不清晰,不够面向对象
       存储过程不太适合面向对象的设计,无法采用面向对象的方式将业务逻辑进行封装,
       业务逻辑在存储层实现,增加了业务和存储的耦合,代码的可读性也会降低,
     2.开发和维护要求比较高
       存储过程的编写直接依赖于开发人员,如果业务逻辑改动较多,需要频繁直接操作数据库,
       大量业务降维到数据库,很多异常不能在代码中捕获,出现问题较难排查,需要数据库管理人员的帮助。 
     3.可移植性差
       过多的使用存储过程会降低系统的移植性。在对存储进行相关扩展时,可能会增加一些额外的工作。
       存储过程与SQL语句如何抉择:
       普通的项目开发中,不建议大量使用存储过程,对比SQL语句,存储过程适用于业务逻辑复杂,比较耗时,同时请求量较少的操作,例如后台大批量查询、定期更新等。

       (1)当一个事务涉及到多个SQL语句时或者涉及到对多个表的操作时可以考虑应用存储过程
       (2)在一个事务的完成需要很复杂的商业逻辑时可以考虑应用存储过程
       (3)比较复杂的统计和汇总可以考虑应用后台存储过程

    存储过程与函数

    核心提示:本质上没区别。只是函数有限制只能返回一个标量,而存储过程可以返回多个。并且函数是可以嵌入在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
     
     
  • 相关阅读:
    HDU 1010 Tempter of the Bone
    HDU 4421 Bit Magic(奇葩式解法)
    HDU 2614 Beat 深搜DFS
    HDU 1495 非常可乐 BFS 搜索
    Road to Cinema
    Sea Battle
    Interview with Oleg
    Spotlights
    Substring
    Dominating Patterns
  • 原文地址:https://www.cnblogs.com/sevene/p/6830677.html
Copyright © 2011-2022 走看看