`
li05810113
  • 浏览: 868 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
文章分类
社区版块
存档分类
最新评论

存储过程

阅读更多
SQL Server存储过程的用法和实例 
首先介绍一下什么是存储过程:存储过程就是将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来,并且这样的语句是放在数

据库中的,还可以根据条件执行不同SQL语句, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完

成命令。
  请大家来了解一下存储过程的语法。
以下是代码片段:
  Create PROC [ EDURE ] procedure_name [ ; number ]
    [ { @parameter data_type }
        [ VARYING ] [ = default ] [ OUTPUT ]
    ] [ ,...n ]

  [ WITH
    { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]

  [ FOR REPLICATION ]

  AS sql_statement [ ...n ]


  一、参数简介

  procedure_name

  新存储过程的名称。过程名必须符合标识符规则,且对于数据库及其所有者必须唯一。

  要创建局部临时过程,可以在 procedure_name 前面加一个编号符 (#procedure_name),要创建全局临时过程,可以在 procedure_name 前面加

两个编号符 (##procedure_name)。完整的名称(包括 # 或 ##)不能超过 128 个字符。指定过程所有者的名称是可选的。

  ;number

  是可选的整数,用来对同名的过程分组,以便用一条 Drop PROCEDURE 语句即可将同组的过程一起除去。例如,名为 orders 的应用程序使用的

过程可以命名为 orderproc;1、orderproc;2 等。Drop PROCEDURE orderproc 语句将除去整个组。如果名称中包含定界标识符,则数字不应包含在标

识符中,只应在 procedure_name 前后使用适当的定界符。

  @parameter

  过程中的参数。在 Create PROCEDURE 语句中可以声明一个或多个参数。用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的

默认值)。存储过程最多可以有 2100 个参数。

  使用@符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。每个过程的参数仅用于该过程本身;相同的参数名称可以用在其它

过程中。默认情况下,参数只能代替常量,而不能用于代替表名、列名或其它数据库对象的名称。

  data_type

  参数的数据类型。所有数据类型(包括 text、ntext 和 image)均可以用作存储过程的参数。不过,cursor 数据类型只能用于 OUTPUT 参数。

如果指定的数据类型为 cursor,也必须同时指定 VARYING 和 OUTPUT 关键字。

  说明:对于可以是cursor 数据类型的输出参数,没有最大数目的限制。

  VARYING

  指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化)。仅适用于游标参数。

  default

  参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程。默认值必须是常量或 NULL。如果过程将对该参数使用 LIKE 关键字,那

么默认值中可以包含通配符(%、_、[] 和 [^])。

  OUTPUT

  表明参数是返回参数。该选项的值可以返回给 EXEC[UTE]。使用 OUTPUT 参数可将信息返回给调用过程。Text、ntext 和 image 参数可用作

OUTPUT 参数。使用 OUTPUT 关键字的输出参数可以是游标占位符。

  n

  表示最多可以指定 2100 个参数的占位符。

  {RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}

  RECOMPILE 表明 SQL Server 不会缓存该过程的计划,该过程将在运行时重新编译。在使用非典型值或临时值而不希望覆盖缓存在内存中的执行

计划时,请使用 RECOMPILE 选项。

  ENCRYPTION 表示 SQL Server 加密 syscomments 表中包含 Create PROCEDURE 语句文本的条目。使用 ENCRYPTION 可防止将过程作为 SQL

Server 复制的一部分发布。

  说明:在升级过程中,SQL Server 利用存储在 syscomments 中的加密注释来重新创建加密过程。

  FOR REPLICATION

  指定不能在订阅服务器上执行为复制创建的存储过程。.使用 FOR REPLICATION 选项创建的存储过程可用作存储过程筛选,且只能在复制过程中

执行。本选项不能和 WITH RECOMPILE 选项一起使用。

  AS

  指定过程要执行的操作。

  sql_statement

  过程中要包含的任意数目和类型的 Transact-SQL 语句。但有一些限制。

  n

  是表示此过程可以包含多条 Transact-SQL 语句的占位符。

  注释

  /*和*/之间的为注释,可以包含一行和多行的说明文字。

  其他说明

  存储过程的最大大小为 128 MB。

  二、存储过程的优点都有哪些呢?

  1.存储过程只在创造时进行编译即可,以后每次执行存储过程都不需再重新编译,而我们通常使用的SQL语句每执行一次就编译一次,所以使用存

储过程可提高数据库执行速度。

  2.经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作。当对数据库进行复杂操作时(如对多个表进行

Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。可以极大的提高数据库的使用效率

,减少程序的执行时间,这一点在较大数据量的数据库的操作中是非常重要的。在代码上看,SQL语句和程序代码语句的分离,可以提高程序代码的可

读性。

  3.存储过程可以设置参数,可以根据传入参数的不同重复使用同一个存储过程,从而高效的提高代码的优化率和可读性。

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

  (1)系统存储过程:以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作,如 sp_help就是取得指定对象的相关信息。

  (2)扩展存储过程 以XP_开头,用来调用操作系统提供的功能exec master..xp_cmdshell 'ping 10.8.16.1'

  (3)用户自定义的存储过程,这是我们所指的存储过程常用格式

  模版:Create procedure procedue_name [@parameter data_type][output][with]{recompile|encryption} as sql_statement

  解释:output:表示此参数是可传回的

  with {recompile|encryption} recompile:表示每次执行此存储过程时都重新编译一次;encryption:所创建的存储过程的内容会被加密。

  三、实例讲解

  实例1:只返回单一记录集的存储过程。

  要求1:查询表bankMoney的内容的存储过程

以下是代码片段:
  create procedure sp_query_bankMoney
  as
  select * from bankMoney
  go
  exec sp_query_bankMoney


  注*  在使用过程中只需要把中的SQL语句替换为存储过程名,就可以了很方便吧!

  实例2(向存储过程中传递参数):

  加入一笔记录到表bankMoney,并查询此表中userID= Zhangsan的所有存款的总金额。

以下是代码片段:
  Create proc insert_bank @param1 char(10),@param2 varchar(20),@param3 varchar(20),@param4 int,@param5 int output
  with encryption ---------加密
  as
  insert bankMoney (id,userID,sex,Money) Values(@param1,@param2,@param3, @param4)
select @param5=sum(Money) from bankMoney where userID='Zhangsan'
  go


  在SQL Server查询分析器中执行该存储过程的方法是:

以下是代码片段:
  declare @total_price int
  exec insert_bank '004','Zhangsan','男',100,@total_price output
  print '总余额为'+convert(varchar,@total_price)
  go


  在这里再啰嗦一下存储过程的3种传回值(方便正在看这个例子的朋友不用再去查看语法内容):

  1.以Return传回整数
  2.以output格式传回参数
  3.Recordset

  传回值的区别:

  output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中。

  实例3:使用带有复杂 Select 语句的简单过程

  下面的存储过程从四个表的联接中返回所有作者(提供了姓名)、出版的书籍以及出版社。该存储过程不使用任何参数。

以下是代码片段:
  USE pubs
  IF EXISTS (Select name FROM sysobjects
         Where name = 'au_info_all' AND type = 'P')
  Drop PROCEDURE au_info_all
  GO
  Create PROCEDURE au_info_all
  AS
  Select au_lname, au_fname, title, pub_name
  FROM authors a INNER JOIN titleauthor ta
      ON a.au_id = ta.au_id INNER JOIN titles t
      ON t.title_id = ta.title_id INNER JOIN publishers p
      ON t.pub_id = p.pub_id
  GO


  au_info_all 存储过程可以通过以下方法执行:

以下是代码片段:
  EXECUTE au_info_all
  -- or
  EXEC au_info_all


  如果该过程是批处理中的第一条语句,则可使用:

以下是代码片段:
  au_info_all


  实例4:使用带有参数的简单过程

以下是代码片段:
  Create PROCEDURE au_info
      @lastname varchar(40),
      @firstname varchar(20)
  AS
  Select au_lname, au_fname, title, pub_name
      FROM authors a INNER JOIN titleauthor ta
      ON a.au_id = ta.au_id INNER JOIN titles t
      ON t.title_id = ta.title_id INNER JOIN publishers p
      ON t.pub_id = p.pub_id
      Where  au_fname = @firstname
      AND au_lname = @lastname
  GO


  au_info 存储过程可以通过以下方法执行:

以下是代码片段:
  EXECUTE au_info 'Dull', 'Ann'
  -- or
  EXECUTE au_info @lastname = 'Dull', @firstname = 'Ann'
  -- or
  EXECUTE au_info @firstname = 'Ann', @lastname = 'Dull'
  -- or
  EXEC au_info 'Dull', 'Ann'
  -- or
  EXEC au_info @lastname = 'Dull', @firstname = 'Ann'
  -- or
  EXEC au_info @firstname = 'Ann', @lastname = 'Dull'


  如果该过程是批处理中的第一条语句,则可使用:

以下是代码片段:
  au_info 'Dull', 'Ann'
  -- or
  au_info @lastname = 'Dull', @firstname = 'Ann'
  -- or
  au_info @firstname = 'Ann', @lastname = 'Dull'


  实例5:使用带有通配符参数的简单过程

以下是代码片段:
  Create PROCEDURE au_info2
  @lastname varchar(30) = 'D%',
  @firstname varchar(18) = '%'
  AS
  Select au_lname, au_fname, title, pub_name
  FROM authors a INNER JOIN titleauthor ta
     ON a.au_id = ta.au_id INNER JOIN titles t
     ON t.title_id = ta.title_id INNER JOIN publishers p
     ON t.pub_id = p.pub_id
  Where au_fname LIKE @firstname
     AND au_lname LIKE @lastname
  GO


  au_info2 存储过程可以用多种组合执行。下面只列出了部分组合:

以下是代码片段:
  EXECUTE au_info2
  -- or
  EXECUTE au_info2 'Wh%'
  -- or
  EXECUTE au_info2 @firstname = 'A%'
  -- or
  EXECUTE au_info2 '[CK]ars[OE]n'
  -- or
  EXECUTE au_info2 'Hunter', 'Sheryl'
  -- or
  EXECUTE au_info2 'H%', 'S%' 


分享到:
评论

相关推荐

    SAP HANA 中调试存储过程

    SAP HANA是一个高性能的内存数据库系统,它提供了一系列功能强大的工具来进行数据分析、应用开发、存储过程编写等操作。其中,对于存储过程的调试是开发者日常开发工作中的一个重要环节,SAP HANA为存储过程提供了...

    SqlServer存储过程及调试指南

    SqlServer存储过程及调试指南的知识点如下: 1. 存储过程概念:存储过程是一组为完成特定功能的SQL语句集,这些语句经过编译后存储在数据库中,供用户通过指定存储过程名和参数(如有)来执行。存储过程被称作...

    SQL存储过程试题及答案

    SQL存储过程试题及答案 SQL存储过程是数据库中的一种程序单元,能够完成特定的数据库操作。今天,我们将讨论三道关于SQL存储过程的试题,这些试题涵盖了存储过程的创建、调用和参数传递等方面。 1. 创建分数存储...

    pb调用存储过程

    在IT行业中,数据库操作是日常开发中的重要环节,而存储过程是数据库中一种高效、封装性强的预编译语句集合。本问题涉及到的是在PowerBuilder(简称Pb)环境中如何调用Oracle或SQL Server等数据库中的存储过程。以下...

    db2 存储过程语法与实例

    DB2存储过程是一种在数据库管理系统中预编译的SQL代码集合,它允许开发人员封装复杂的业务逻辑和数据处理操作,并可以被多次调用。DB2作为一款强大的关系型数据库管理系统,其存储过程功能强大,提高了应用程序的...

    sqlserver存储过程解密工具

    SQL Server存储过程是一种预编译的SQL代码集合,它们允许数据库开发者封装复杂的业务逻辑和数据操作,提高数据库应用的性能和可维护性。然而,由于存储过程的源代码通常是不可见的,对于需要查看或修改这些过程的...

    存储过程扩展学习

    在SQL Server中,存储过程分为不同种类,包括用户定义的存储过程、系统存储过程、临时存储过程以及扩展存储过程。 1. **用户定义的存储过程**:由开发人员或DBA创建,可以根据业务需求定制各种复杂操作,如数据处理...

    pl sql developer调试存储过程及调试包中创建的存储过程

    PL/SQL Developer 调试存储过程及调试包中创建的存储过程 PL/SQL Developer 调试存储过程是指使用 PL/SQL Developer 工具来调试 Oracle 数据库中的存储过程。调试存储过程可以帮助开发者快速地定位和解决存储过程...

    数据库查询的存储过程

    数据库查询的存储过程 数据库查询的存储过程是数据库管理系统中一种非常重要的概念。它可以将多个SQL语句组合成一个单元,提高数据库的查询效率和性能。 存储过程的优点: 1. 可以在单个存储过程中执行一系列SQL...

    存储过程的优点

    ### 存储过程的优点 #### 一、提升执行效率 1. **编译优势**:存储过程在创建时仅编译一次,之后每次执行时都无需再次编译。相比之下,一般的SQL语句每次执行都需要重新编译。这种差异使得存储过程能够显著提高...

    mysql存储过程教程

    MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者预编译一系列SQL语句并封装成一个可重复使用的单元,从而提高数据处理的效率和代码的复用性。本教程将深入探讨MySQL存储过程的创建、调用以及相关概念...

    oracle存储过程学习经典入门

    本文将从 Oracle 存储过程的基础知识开始,逐步深入到 Oracle 存储过程的高级应用,包括 Hibernate 调用 Oracle 存储过程和 Java 调用 Oracle 存储过程的方法。 Oracle 存储过程基础知识 Oracle 存储过程是 Oracle...

    C# winform调用SQL存储过程-菜鸟入门 详细注释

    内容概要:简单的C# winform调用存储过程实例,创建存储过程入参,通过SqlConnection对象和SqlCommand对象调用存储过程,获取存储过程的出参并显示出来,详细代码注释,希望对用到C#调用存储过程的小伙伴有帮助 ...

    MySQL存储过程的异常处理方法

    在MySQL中,存储过程是一种预编译的SQL代码集合,它可以执行复杂的操作并提供更好的性能。在编写存储过程时,异常处理是确保程序稳定性和健壮性的重要环节。本实例展示了如何在MySQL存储过程中实现异常处理,以捕获...

    用友r9知识存储过程

    《用友R9知识存储过程详解》 在IT行业中,特别是在企业级财务系统中,数据库的高效管理和数据处理是至关重要的。用友R9作为一款先进的财务管理系统,它利用存储过程这一强大的数据库功能来优化账务处理,提高系统...

    SQL Server存储过程对比工具

    SQL Server存储过程对比工具是一种高效且实用的软件解决方案,它专为数据库管理员和开发人员设计,用于比较和分析两个SQL Server数据库中的存储过程。这款工具的主要功能是帮助用户快速识别和定位不同数据库间存储...

    创建存储过程,触发器

    在数据库管理中,存储过程和触发器是两个重要的概念,它们极大地增强了数据库的功能和效率。存储过程是一组预先编写的SQL语句,可以被多次调用,减少了网络流量,提高了性能,并提供了更好的安全性。而触发器则是一...

    Informatica调用存储过程图文流程

    Informatica调用存储过程图文流程 Informatica 是一款功能强大的数据集成工具,能够帮助用户快速、可靠地集成各种数据源。调用存储过程是 Informatica 中的一种常用功能,下面将详细介绍 Informatica 调用存储过程...

    存储过程文档--mysql

    存储过程文档--MySQL 存储过程是 MySQL 中的一个强大功能,它允许用户预先将常用的或复杂的工作写入 SQL 语句,并将其存储起来,以便在以后的数据库操作中可以快速调用和执行。存储过程可以提高数据库的执行速度,...

Global site tag (gtag.js) - Google Analytics