带参数的存储过程

流过昼夜 提交于 2019-12-28 02:02:48

创建带参数的sql存储过程:创建带参数的存储过程首先要在存储过程中声明该参数,每个存储过程参数都必须用惟一的名称进行定义。与标准的Transact-SQL变量相同,参数名必须以@为前缀,
创建带参数的存储过程
创建带参数的存储过程首先要在存储过程中声明该参数,每个存储过程参数都必须用惟一的名称进行定义。与标准的Transact-SQL变量相同,参数名必须以@为前缀,并且遵从对象标识符规则。当用户不提供该参数的值时可以使用一个默认值来代替。
在执行带参数的存储过程时,既可以通过显式指定参数名称并赋予适当的值,也可以通过提供在CREATE PROCEDURE语句中给定的参数值(不指定参数名称)来向存储过程传递值。
在存储过程PRO_Student_IN中命名4个参数,其定义顺序为@Chinese、@English、@maths和@class。
例如,将值传递给存储过程指定的参数名称。
EXEC PRO_Student_IN @class="三年一班",@Chinese=85,@maths=85,@English=85
例如,按照参数的位置传递,而不命名参数名称。
EXEC PRO_Student_IN 85,85,85,"三年一班"
1.不带默认值的参数
创建一个参数不带默认值的存储过程,在调用该存储过程时,必须对存储过程中的所有参数进行赋值,如果有一个参数没有赋值,则无法调用该存储过程。
下面创建一个不带参数默认值的存储过程,并通过指定参数的赋值,查询“MR_Student”表中指定班级的学生信息。运行结果如图1所示。

图1 创建带参数的存储过程
操作步骤如下:
(1)在操作系统的任务栏中单击“开始”菜单,选择“程序”→“Microsoft SQL Server”→“查询分析器”命令,打开查询分析器。
(2)SQL语句如下:
USE MR_SQ --打开创建存储过程的数据库
GO
--创建存储过程
CREATE PROCEDURE PRO_Student_IN
@Chinese int, --定义参数
@English int,
@maths int,
@class varchar(20)
AS
Select *
from MR_Student
where 语文>@Chinese and 英语>@English and 数学>@maths and 班级=@class
GO
执行PRO_Student_IN存储过程有两种方法。
(1)按存储过程中参数的顺序对参数进行赋值。
EXEC PRO_Student_IN 65,77,70,"三年一班"
(2)执行存储过程时,可以按任意顺序对参数进行赋值。
EXEC PRO_Student_IN @class="三年一班",@Chinese=65,@maths=70,@English=77
2.带默认值的参数
在执行存储过程PRO_Student_IN时,如果缺省任何一个参数,将会产生错误,解决这种问题的方法是建立使用默认值的参数。只要在参数的定义之后加上等号,并在等号后面写出默认值。
例如,给参数设置默认值。
@Str varchar(20)='长春',
@Int Int=10,
@Char char(8)='0001',
@float float=12.3
本示例利用存储过程中的默认参数对数据表“MR_Student”进行查询。运行结果如图2所示。

 



图2 创建带参数默认值的存储过程
操作步骤如下:
(1)在操作系统的任务栏中单击“开始”菜单,选择“程序”→“Microsoft SQL Server”→“查询分析器”命令,打开查询分析器。
(2)SQL语句如下:
--创建存储过程
USE MR_SQL
GO
CREATE PROCEDURE PRO_Student_NULL
@Chinese int=60, --对参数设置默值
@English int=60,
@maths int=60,
@class varchar(20)='三年二班'(责任编辑:admin)

AS
Select *
from MR_Student
where 语文>@Chinese and 英语>@English and 数学>@maths and 班级=@class
GO
执行存储过程,查询三年二班成绩全部及格并且数学成绩大于80的学生信息。
EXEC PRO_Student_NULL @maths=80
也可以用以下SQL语句调用PRO_Student_NULL存储过程:
例如,查询三年二班成绩全部及格并且语文成绩大于70的学生信息。
EXEC PRO_Student_NULL 70
例如,查询三年二班成绩全部及格的学生信息。
EXEC PRO_Student_NULL
3.带返回参数的存储过程
在创建存储过程时,可以用OUTPOT参数来创建一个带返回值的存储过程,例如:
@int int OUTPUT
@char char(10) OUTPUT
@float float OUTPUT
其中text、image等大于二进制数据类型的参数不能作为OUTPUT参数,在调用存储过程时,不必为返回参数赋值。
本示例利用存储过程中的OUTPUT参数,在调用存储过程后利用返回值来判断查询的结果。运行结果如图3所示。

图3 创建带返回参数的存储过程
操作步骤如下:
(1)在操作系统的任务栏中单击“开始”菜单,选择“程序”→“Microsoft SQL Server”→“查询分析器”命令,打开查询分析器。
(2)SQL语句如下:
--创建带返回值的存储过程
CREATE PROCEDURE PRO_OUP
@class char(10),
@ave int OUTPUT --设置带返回值的参数
AS
select @ave =avg(数学) from MR_Student where 班级=@class
GO
--执行存储过程
DECLARE @average int --自定义变量
DECLARE @subject char(10)
SET @subject='三年一班' --对变量进行赋值
EXEC PRO_OUP @subject,@average output --调用存储过程
if @average>=85 --利用存储过程的返回值进行判断
PRINT rtrim(@subject)+'数学的平均成绩为高等水平'
if @average>=70
PRINT rtrim(@subject)+'数学的平均成绩为中等水平'
if @average<70
PRINT rtrim(@subject)+'数学的平均成绩为一般水平'
运行结果:
三年一班数学的平均成绩为79,属于中等水平

(责任编辑:admin)

 

 

摘要 存储过程的调用在B/S系统中用的很多。传统的调用方法不仅速度慢,而且代码会随着存储过程的增多不断膨胀,难以维护。新的方法在一定程度上解决了这些问题。

  关键词 ASP.NET;存储过程
 
  在使用.NET的过程中,数据库访问是一个很重要的部分,特别是在B/S系统的构建过程中,数据库操作几乎成为了一个必不



可少的操作。调用存储过程实现数据库操作使很多程序员使用的方法,而且大多数的程序员都是能使用存储过程就使用存储过程,很少直接使用SQL语句,所以存储过程是很有用而且很重要的。

  存储过程简介

  简单的说,存储过程是由一些SQL语句和控制语句组成的被封装起来的过程,它驻留在数据库中,可以被客户应用程序调用,也可以从另一个过程或触发器调用。它的参数可以被传递和返回。与应用程序中的函数过程类似,存储过程可以通过名字来调用,而且它们同样有输入参数和输出参数。

  根据返回值类型的不同,我们可以将存储过程分为三类:返回记录集的存储过程, 返回数值的存储过程(也可以称为标量存储过程),以及行为存储过程。顾名思义,返回记录集的存储过程的执行结果是一个记录集,典型的例子是从数据库中检索出符合某一个或几个条件的记录;返回数值的存储过程执行完以后返回一个值,例如在数据库中执行一个有返回值的函数或命令;最后,行为存储过程仅仅是用来实现数据库的某个功能,而没有返回值,例如在数据库中的更新和删除操作。

  使用存储过程的好处

  相对于直接使用SQL语句,在应用程序中直接调用存储过程有以下好处:

  (1)减少网络通信量。调用一个行数不多的存储过程与直接调用SQL语句的网络通信量可能不会有很大的差别,可是如果存储过程包含上百行SQL语句,那么其性能绝对比一条一条的调用SQL语句要高得多。

  (2)执行速度更快。有两个原因:首先,在存储过程创建的时候,数据库已经对其进行了一次解析和优化。其次,存储过程一旦执行,在内存中就会保留一份这个存储过程,这样下次再执行同样的存储过程时,可以从内存中直接调用。

  (3)更强的适应性:由于存储过程对数据库的访问是通过存储过程来进行的,因此数据库开发人员可以在不改动存储过程接口的情况下对数据库进行任何改动,而这些改动不会对应用程序造成影响。

  (4) 布式工作:应用程序和数据库的编码工作可以分别独立进行,而不会相互压制。

  由以上的分析可以看到,在应用程序中使用存储过程是很有必要的。

  两种不同的存储过程调用方法

  为了突出新方法的优点,首先介绍一下在.NET中调用存储过程的“官方”方法。另外,本文的所有示例程序均工作于SqlServer数据库上,其它情况类似,以后不再一一说明。本文所有例子均采用C#语言。

  要在应用程序中访问数据库,一般性的步骤是:首先声明一个数据库连接SqlConnection,然后声明一个



数据库命令SqlCommand,用来执行SQL语句和存储过程。有了这两个对象后,就可以根据自己的需要采用不同的执行方式达到目的。需要补充的是,不要忘记在页面上添加如下的引用语句:using System.Data.SqlClient。

  就执行存储过程来说,如果执行的是第一类存储过程,那么就要用一个DataAdapter将结果填充到一个DataSet中,然后就可以使用数据网格控件将结果呈现在页面上了;如果执行的是第二和第三种存储过程,则不需要此过程,只需要根据特定的返回判定操作是否成功完成即可。

  (1)执行一个没有参数的存储过程的代码如下:


SqlConnection conn=new SqlConnection(“connectionString”);
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand();
da.SelectCommand.Connection = conn;
da.SelectCommand.CommandText = "NameOfProcedure";
da.SelectCommand.CommandType = CommandType.StoredProcedure;

  然后只要选择适当的方式执行此处过程,用于不同的目的即可。

  (2)执行一个有参数的存储过程的代码如下(我们可以将调用存储过程的函数声明为ExeProcedure(string inputdate)):


SqlConnection conn=new SqlConnection(“connectionString”);
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand();
da.SelectCommand.Connection = conn;
da.SelectCommand.CommandText = "NameOfProcedure";
da.SelectCommand.CommandType = CommandType.StoredProcedure;
(以上代码相同,以下为要添加的代码)
param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
param.Direction = ParameterDirection.Input;
param.Value = Convert.ToDateTime(inputdate);
da.SelectCommand.Parameters.Add(param);

  这样就添加了一个输入参数。若需要添加输出参数:


param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
param.Direction = ParameterDirection.Output;
param.Value = Convert.ToDateTime(inputdate);
da.SelectCommand.Parameters.Add(param);

  若要获得参储过程的返回值:


param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
param.Direction = ParameterDirection.ReturnValue;
param.Value = Convert.ToDateTime(inputdate);
da.SelectCommand.Parameters.Add(param);

  从上面的代码我们可以看出,当存储过程比较多或者存储过程的参数比较多时,这种方法会大大影响开发的速度;另外一方面,如果项目比较大,那么这些用于数据库逻辑的函数在以后的维护中也是一个很大的负担。那么,有没有一种改进的方法可以解决这个问题呢?想到在执行没有参数的存储过程时只需要传入一个存储过程的名字就可以调用相应的存储过程,而且在SqlServer数据库中我们可以直接在查询分析器中敲入“存储过程名(参数列表)”样的字符串就可以执行存储过程,那么,是



否可以把这种思想应用到应用程序中呢?

  于是在编译器中键入相应代码。这些代码是在调用不带参数的存储过程的代码的基础上改的。具体代码如下:


SqlConnection conn=new SqlConnection(“connectionString”);
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand();
da.SelectCommand.Connection = conn;
da.SelectCommand.CommandText = "NameOfProcedure(’para1’,’para2’,para3)";
da.SelectCommand.CommandType = CommandType.StoredProcedure;

  为了使代码更具有代表性,要调用的存储过程的第一个和第二个参数都为字符串类型,第三个参数为整型。执行以后发现,完全可以达到预期的效果!


SqlConnection conn=new SqlConnection("server=.;uid=sa;pwd=sa;database=yourdatabase")
SqlCommand cmd=new SqlCommand("libsearch",conn);
cmd.CommandType = CommandType.StoredProcedure;//指示libsearch为存储过程
cmd.Parameters.Add("@name",SqlDbType.Char,20);
cmd.Parameters["@name"].Value=传入name的值
cmd.Parameters.Add("@member_no",SqlDbType.Int,4);
cmd.Parameters["@member_no"].Value=传入member_no的值
cmd.Parameters.Add("@loancount",SqlDbType.Int,4);
cmd.Parameters["@loancount"].Direction=ParameterDirection.Output;

cmd.ExcuteNonQuery();//执行存储过程
string loancount=cmd.Parameters["@loancount"].Value.ToString()
//得到值.

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!