zoukankan      html  css  js  c++  java
  • 网络工作室暑假后第二次培训资料(SQLServer存储过程和ADO.NET访问存储过程)整理(一)

    因为昨天我的SQL Server 2008数据库在使用的时候突然就打不开了。而起前天还用它来写T-SQL语句来着。所以很是郁闷啊,到网上查询以后,不能解决,就干脆重新安装了一边,所以昨天整理的内容不能够及时的更新到博客上,只能今天继续整理,然后更新了。

    这次主要是讲ADO.NET访问存储过程的知识,所以,在开篇的时候还是把SQL Server存储过程的知识给串讲,复习一下。

    对于前段程序开发人员来说,存储过程是很重要的工具,他可以使开发者在不了解表架构的情况下使用存储过程对数据进行处理。同时,由于存储过程具有封装的概念,当逻辑规则改变时,可以在不影响前端程序设计的情况下对后端程序进行修改。

    存储过程包括视图的所有的优点,视图只有select命令,而存储过程则包含了几乎所有的T-Sql命令。
    存储过程可以很大的提高T-SQl命令的执行效率。
    T-Sql语句在SQl Server 客户端执行的过程:

    每次执行时都需要分析语句正确与否,优化与编译成执行计划,再对照SQl Server中是否有相同的执行计划。

    一般的T-SQl命令重复执行时,会一直执行同样的分析,最优化,编译的工作,将耗费大量的CPU时间。

    而是用存储过程则是只进行一次分析,优化,编译的过程,之后就直接依照SqlServer缓存中的执行计划直接执行。

    优点:减少网络带宽的占用:因为存储过程是在SqlServer端执行,不需要和前端进行来回的沟通,相比之下就减少了在网络上传递包的带宽占用量,对于网络程序执行来说,使用存储过程能够减少对网络带宽的占用。

    SqlServer存储过程的声明方式:

    Create  proc存储过程名称

    As

    T-sql命令

    SqlServer存储过程分为无参数存储过程和有参数存储过程

    1)没有参数的存储过程

    调用存储过程

    Exec  存储过程名称;

    这样的用法和视图差不多,但是视图不可以使用order by命令。而存储过程没有这样的限制。

    示例1-1代码如下:

    1 --创建不带参数的存储过程
    2 create proc select_activity
    3 as
    4 --该存储过程所执行的sql命令
    5 select * from T_Activity;

    SQL调用该存储过程

    1 --调用select_activity存储过程
    2 exec select_activity

    有参数的存储过程

    主要有三种类型的参数:

    1)输入参数2)输出参数3)返回值

    输入参数即在调用这个存储过程之前必须输入参数而该参数仅在程序中使用,并不会再返回给用户

    基本的声明方式:

    Create proc  存储过程名称

    @输入参数名称1  数据类型,

    @输入参数名称2  数据类型

    As

    T-sql命令

    如果存在多个参数,就需要在各个输入参数间以逗号分隔 。如果参数是字符串或者日期,则需要用单引号括起来,而数字则不用。

    备注:

    存储过程通常不要编写太长,因为存储过程是在数据库端执行的,太长的话会影响执行效率;

    示例1-2代码如下:

     1 --创建带参数的存储过程
     2 create proc select_activity1
     3 
     4 --修改存储过程的语句
     5 --alter proc select_activity1
     6 
     7 --声明参数,多个参数有“,”号分隔符隔开,参数后面声明该参数的数据类型
     8 @id int,
     9 @activityName nvarchar(50)
    10 as
    11 --该存储过程所执行的Sql命令
    12 select * from T_Activity where id=@id and activityName=@activityName;
    13 
    14 --调用带参数的存储过程
    15 --如果参数是字符串或者日期,则需要用单引号括起来,而数字则不用。
    16 exec select_activity1 5,'比武招亲'
    17 
    18 --或者
    19 exec select_activity1
    20 @id=1,
    21 @activityName='比武招新';

    存储过程中可以包含一些简单的编程语句

    比如:if ,begin  ·····end····等语句

    示例1-3代码如下:

     1 --在设置参数时,如果需要给设置的参数赋值,则在声明的参数后面加“=”后面跟所设置的初始值,这里设置的初始值为空
     2 create proc sele_activity
     3 @id int=null,
     4 @activityInfoId int=null
     5 as
     6 
     7 --使用的if语句来判断输入的参数值是否为空,如果为空则返回前端错误信息“请输入参数”,而且使用return立刻结束该存储过程
     8 if @id is null or @activityInfoId is null
     9     begin
    10         raiserror('请输入参数',16,1)
    11         return
    12         end
    13 --执行的sql命令
    14 select * from T_Activity where id=@id or activityInfoId=@activityInfoId;
    15 
    16 --使用了没有给参数赋值的存储过程,返回错误
    17 --错误信息:“消息 50000,级别 16,状态 1,过程 sele_activity,第 7 行 请输入参数”
    18 exec sele_activity;
    19 
    20 --这样调用返回正确的结果
    21 exec sele_activity
    22 @id=2,
    23 @activityInfoId=8;

    输出参数的存储过程

    输出参数和输入参数刚好相反,输入参数只会在as一下活动,而输出参数则返回前端使用

    输出参数的声明过程:

    Createproc存储过程名称

    @输入参数名称   数据类型

    @输出参数名称   数据类型  output

    As

    T-Sql命令

    在声明输出参数变量时,必须声明为output,存储过程执行完成以后会将输出参数返回前端

    示例1-4代码如下:

     1 --创建select_MathResult的存储过程
     2 create proc select_MathResult
     3 --声明输出参数@activityName和参数的类型
     4 @activityName nvarchar(50),
     5 --声明输出参数,并使用output来表明该参数为输出参数
     6 @result int output
     7 
     8 as
     9 --使用T-SQL语句来返回相同activityName的数据行数
    10 select @result=count(*) from T_Activity where activityName=@activityName
    11 
    12 --调用存储过程,调用时先声明接受输出参数的参数@answer和该参数的类型
    13 declare @answer int
    14 exec select_MathResult '比武招亲' ,@answer output
    15 
    16 select '结果是',@answer

    这样就完成了对Sql Server存储过程的复习,在下一篇文章将要介绍怎样使用ADO.NET访问存储过程。文章地址:http://www.cnblogs.com/qq731109249/archive/2012/10/07/2714238.html

  • 相关阅读:
    Codeforces 845E Fire in the City 线段树
    Codeforces 542D Superhero's Job dp (看题解)
    Codeforces 797F Mice and Holes dp
    Codeforces 408D Parcels dp (看题解)
    Codeforces 464D World of Darkraft
    Codeforces 215E Periodical Numbers 容斥原理
    Codeforces 285E Positions in Permutations dp + 容斥原理
    Codeforces 875E Delivery Club dp
    Codeforces 888F Connecting Vertices 区间dp (看题解)
    Codeforces 946F Fibonacci String Subsequences dp (看题解)
  • 原文地址:https://www.cnblogs.com/yisuowushinian/p/2714236.html
Copyright © 2011-2022 走看看