`
jayghost
  • 浏览: 443774 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

【转】详解SQLServer 存储过程

 
阅读更多

转自:http://www.webjx.com/database/sqlserver-14170.htm

 

Sql Server的存储过程是一个被命名的存储在服务器上的Transacation-Sql语句集合,是封装重复性工作的一种方法,它支持用户声明的变量、条件执行和其他强大的编程功能。

存储过程相对于其他的数据库访问方法有以下的优点:

(1)重复使用。存储过程可以重复使用,从而可以减少数据库开发人员的工作量。

(2)提高性能。存储过程在创建的时候就进行了编译,将来使用的时候不用再重新编译。一般的SQL语句每执行一次就需要编译一次,所以使用存储过程提高了效率。

(3)减少网络流量。存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。

(4)安全性。参数化的存储过程可以防止SQL注入式的攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。

存储过程一共分为了三类:用户定义的存储过程、扩展存储过程以及系统存储过程。

其中,用户定义的存储过程又分为Transaction-SQL和CLR两种类型。

Transaction-SQL 存储过程是指保存的Transaction-SQL语句集合,可以接受和返回用户提供的参数。

CLR存储过程是指对.Net Framework公共语言运行时(CLR)方法的引用,可以接受和返回用户提供的参数。他们在.Net Framework程序集中是作为类的公共静态方法实现的。(本文就不作介绍了)

创建存储过程的语句如下:

 

以下为引用的内容:

CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ] 
    
[ { @parameter [ type_schema_name. ] data_type } 
        
[ VARYING ] [ = default ] [ [ OUT [ PUT ] 
    ] 
[ ,] 
[ WITH <procedure_option> [ ,]
[ FOR REPLICATION ] 
AS { <sql_statement> [;][ ] | <method_specifier> }
[;]
<procedure_option> ::= 
    
[ ENCRYPTION ]
    
[ RECOMPILE ]
    
[ EXECUTE_AS_Clause ]

<sql_statement> ::= 
[ BEGIN ] statements [ END ] }

<method_specifier> ::=
EXTERNAL NAME assembly_name.class_name.method_name

 

     [schema_name]: 代表的是存储过程所属的架构的名称

      例如:

            Create Schema yangyang8848      
            Go
            Create Proc yangyang8848.AllGoods
            As Select * From Master_Goods
            Go

            执行:Exec AllGoods 发生错误。

            执行:Exec yangyang8848.AllGoods 正确执行。

      [;Number]: 用于对同名过程进行分组的可选整数。使用一个 DROP PROCEDURE 语句可将这些分组过程一起删除。

      例如:

            Create Proc S1 ;1
            AS
                   Select * From Master_Goods
            Go
            Create Proc S1 ;2
            As 
                   Select * From Master_Location
            Go

  创建完毕了两个存储过程。它们在同一个组S1里,如果执行Exec S1 则存储过程默认执行 Exec S1 ;1 。如果我们想得到所有据点信息则需要执行Exec S1 ;2。当我们要删除存储过程的时候,只能执行Drop Exec S1 则该组内所有的存储过程被删除。

      [@ parameter]: 存储过程中的参数,除非将参数定义的时候有默认值或者将参数设置为等于另一个参数,否则用户必须在调用存储过程的时候为参数赋值。

      存储过程最多有2100个参数。

      例如:

      Create Proc yangyang8848.OneGoods
      @GoodsCode varchar(10)
      As 
             Select * From Master_Goods Where GoodsCode = @GoodsCode
      Go

      调用的代码:

      Declare @Code varchar(10)
      Set @Code = '0004'
      Exec yangyang8848.OneGoods @Code

      在参数的后边加入Output 表明该参数为输出参数。

      Create Proc yangyang8848.OneGoods
      @GoodsCode2 varchar(10) output,@GoodsCode varchar(10) = '0011'
      As 
             Select * From Master_Goods Where GoodsCode = @GoodsCode
             Set @GoodsCode2 = '0005'
      Go

      调用方法:
      Declare @VV2 varchar(10)
      Exec yangyang8848.OneGoods  @Code out

      注意:如果存储过程的两个参数一个有默认值一个没有,那么我们要把有默认值得放在后边,不然会出问题哦~~

      细心的朋友,可能看到上边的语句有一些不同,比如,存储过程用的是output,而调用语句用的是out。我要告诉您,两者是一样的。

 

      [RECOMPILE]:指示数据库引擎 不缓存该过程的计划,该过程在运行时编译。如果指定了 FOR REPLICATION,则不能使用此选项。对于 CLR 存储过程,不能指定 RECOMPILE。 
 

      这个说一个非常好用的函数 OBJECT_ID :返回架构范围内对象的数据库对象标识号。

      例如:我们创建存储过程时,可以如下写代码

      If Object_ID('yangyang8848.OneGoods') Is Not Null
             Drop Proc yangyang8848.OneGoods
      Go

      Create Proc yangyang8848.OneGoods
      @GoodsCode2 varchar(10) out,@GoodsCode varchar(10) = '0011'
      As 
             Select * From Master_Goods Where GoodsCode = @GoodsCode
             Set @GoodsCode2 = '0005'
      Go

      针对于上边的这个存储过程,我们调用以下SQL查询

      Select definition From sys.sql_modules
            Where object_id = Object_ID('yangyang8848.OneGoods');

      我们是可以查到结果的。

可是如果我们对该存储过程加入[ ENCRYPTION ] 那么你将无法看到任何结果

      If Object_ID('yangyang8848.OneGoods') Is Not Null
             Drop Proc yangyang8848.OneGoods
      Go

      Create Proc yangyang8848.OneGoods
      @GoodsCode2 varchar(10) out,@GoodsCode varchar(10) = '0011'

      With Encryption
      As 
             Select * From Master_Goods Where GoodsCode = @GoodsCode
             Set @GoodsCode2 = '0005'
      Go

      然后我们查询 sys.sql_modules 目录视图,将返回给你Null。

      然后我们执行以下SQL: Exec sp_helptext 'yangyang8848.OneGoods'

      你将得到以下结果:The text for object 'yangyang8848.OneGoods' is encrypted.

      说到这里你应该明白了,参数[ ENCRYPTION ]:是一种加密的功能, 将 CREATE PROCEDURE 语句的原始文本转换为模糊格式。模糊代码的输出在 SQL Server 2005 的任何目录视图中都不能直接显示。对系统表或数据库文件没有访问权限的用户不能检索模糊文本。但是,可通过 DAC 端口访问系统表的特权用户或直接访问数据库文件的特权用户可使用此文本。此外,能够向服务器进程附加调试器的用户可在运行时从内存中检索已解密的过程。

 

      前两天写了一篇关于游标的介绍文章 ,下边写一个例子,将游标与存储过程一起使用上:

      If Object_ID('dbo.GetMasterGoods') Is Not Null
            Drop Proc dbo.GetMasterGoods
      Go

      Create Proc GetMasterGoods
      @MyCursor Cursor Varying Output
      With Encryption
      As 
             Set @MyCursor = Cursor
             For
                    Select GoodsCode,GoodsName From Master_Goods
      Open @MyCursor
      Go

      --下边建立另外一个存储过程,用于遍历游标输出结果

      Create Proc GetAllGoodsIDAndName
      As

      Declare @GoodsCode varchar(18)
      Declare @GoodsName nvarchar(20)
      Declare @MasterGoodsCursor Cursor
      Exec GetMasterGoods @MasterGoodsCursor out
      Fetch Next From @MasterGoodsCursor
      InTo @GoodsCode,@GoodsName
      While(@@Fetch_Status = 0)
      Begin
             Begin
                    Print @GoodsCode + ':' + @GoodsName
             End
             Fetch Next From @MasterGoodsCursor
             InTo @GoodsCode,@GoodsName
      End
      Close @MasterGoodsCursor
      Deallocate @MasterGoodsCursor
      Go

      最后执行Exec GetAllGoodsIDAndName结果为以下内容

      0003:品0003
      0004:品0004
      0005:123123
      0006:品0006
      0007:品0007
      0008:品0008
      0009:品0009
      0010:品0010
      0011:品0011
      0012:品0012
      0013:品0013
      0014:品0014

 

 

分享到:
评论

相关推荐

    oracle到sqlserver存储过程语法转换

    ### Oracle到SQL Server存储过程语法转换详解 在数据库迁移项目中,从Oracle迁移到SQL Server是一种常见的场景。本文旨在提供一份详细的指南,帮助开发者更好地理解这两种数据库系统在存储过程方面的语法差异,并...

    学习SQL Server存储过程入门例子详解

    SQL Server 存储过程入门例子详解 SQL Server 存储过程是数据库管理员和开发人员的必备技能,本文将通过三个简单的例子来详细介绍 SQL Server 存储过程的基本知识。 例 1:简单的存储过程 在这个例子中,我们将...

    sql server 2008 存储过程与储发器 详解 书籍

    在SQL Server 2008中,存储过程和触发器是数据库管理中不可或缺的重要组成部分,它们...通过深入学习《SQL Server 2008 存储过程与触发器详解》这本书,读者将能全面理解和掌握这两个概念,从而在实际项目中得心应手。

    sqlserver 存储过程With Encryption加密的解密

    ### SQL Server 存储过程 With Encryption 加密的解密方法 #### 背景与目的 在SQL Server中,为了保护存储过程中的敏感代码或逻辑,可以使用`WITH ENCRYPTION`选项对存储过程进行加密处理。这可以有效防止未经授权...

    SQL Server 存储过程与实例

    以下是关于SQL Server存储过程的详细说明: 1. **存储过程的概念** 存储过程Procedure是一系列SQL语句的集合,它们在数据库中以编译好的形式存储,当需要执行时,只需要调用存储过程的名称并传入相应的参数。存储...

    Delphi与SQL Server存储过程编程详解

    在Delphi中调用SQL Server存储过程,主要涉及到以下几个关键组件和步骤: 1. **ADOConnection**: 这是连接到数据库的主要组件,负责建立和管理与SQL Server的连接。在本例中,设置其属性`Connection`指向`...

    SQLSERVER 存储过程 语法

    本文将深入解析SQL Server存储过程的创建、参数传递、事务管理、条件判断以及游标使用的语法细节。 #### 创建存储过程 存储过程的基本语法如下: ```sql CREATE PROCEDURE 存储过程名称 @参数1 数据类型, @参数...

    SQL Server导出表到EXCEL文件的存储过程

    ### SQL Server导出表到Excel文件的存储过程详解 #### 标题理解: - **标题内容**:“SQL Server导出表到EXCEL文件的存储过程” - **标题解读**:此标题表明文章将介绍一种在SQL Server环境中使用的存储过程,该...

    SqlServer存储过程

    ### SqlServer存储过程详解 #### 一、存储过程概述 **存储过程**是数据库中一种重要的数据对象,它实质上是一组预编写的T-SQL命令集,通过定义特定的功能来实现复杂的数据处理任务。存储过程可以被视为数据库的...

    sqlserver存储过程

    ### SQL Server 存储过程详解 #### 设计与创建存储过程 存储过程是SQL Server中预编译的一系列SQL语句,它们存储在数据库中,可通过名称调用,以执行特定任务。几乎任何Transact-SQL代码都可以用来创建存储过程,...

    SQLServer储存过程-130808

    ### SQL Server 存储过程详解 #### 引言与概念 存储过程,作为数据库管理系统中的重要组成部分,尤其在SQL Server中扮演着核心角色。它是一种预编译的SQL语句集合,存储在数据库中,可以接受输入参数,执行一系列...

    SqlServer存储过程游标

    ### SqlServer 存储过程与游标应用实例详解 #### 一、存储过程概述 在SQL Server中,存储过程是一种预编译的SQL语句集合,它可以被当作一个单独的对象来调用。存储过程可以提高应用程序性能,简化复杂的业务逻辑,...

    公司系统研发讲解sqlserver的存储过程

    本文将深入探讨SQL Server存储过程的基础概念、创建方法及应用场景,旨在帮助读者快速入门并掌握其基本用法。 #### 二、存储过程概述 ##### 1. 定义 存储过程是一组预编译的T-SQL语句集合,它被作为一个单元存储...

    sql server 存储过程100例

    SQL Server存储过程是数据库开发和管理中的重要工具,它们是一组预先编译的T-SQL语句,可以执行复杂的数据库操作。在这个“SQL Server 存储过程100例”中,你将深入理解存储过程的多样性和实用性,超过100个示例将...

    sql_server存储过程

    ### SQL Server 存储过程详解 #### 一、概述 SQL Server 存储过程是一种预编译的SQL脚本,可以提高SQL语句的执行效率并简化复杂的数据库操作。存储过程能够实现对数据库的安全访问,并支持参数化查询,增强应用程序...

    SQL Server存储过程

    **SQL Server 存储过程详解** SQL Server 存储过程是一种预编译的数据库对象,它集合了一系列的SQL语句和控制流语句,用于执行特定的数据库操作。存储过程的作用在于提高数据库的性能和安全性,减少网络流量,提供...

    详解SQL Server分布式查询

    详解SQL Server分布式查询 SQL Server中的分布式查询(Distributed Query)是指能够访问存放在同一部计算机或不同计算机上的SQL Server或不同种类的数据源。分布式查询与普通查询的区别在于它需要连接多个MSSQL...

    sqlserver常用的存储过程

    ### SQL Server 常用的存储过程详解 在数据库管理与开发过程中,存储过程作为一种预编译的对象,能够显著提高数据库应用的性能,并且能够更好地实现业务逻辑的封装。SQL Server 提供了一系列丰富的内置存储过程以及...

    SQLSERVER实用教程- 存储过程和触发器.pdf

    ### SQL Server 存储过程与触发器详解 #### 一、存储过程概述 **存储过程**是在数据库中预编译并存储的一组SQL语句,它可以在SQL Server中执行复杂的数据处理逻辑。存储过程不仅可以提高应用程序的性能,还可以...

Global site tag (gtag.js) - Google Analytics