SQL存储过程实例.docx_第1页
SQL存储过程实例.docx_第2页
SQL存储过程实例.docx_第3页
SQL存储过程实例.docx_第4页
SQL存储过程实例.docx_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

sql server存储过程语法存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令。 定义总是很抽象。存储过程其实就是能完成一定操作的一组SQL语句,只不过这组语句是放在数据库中的(这里我们只谈SQL Server)。如果我们通过创建存储过程以及在ASP中调用存储过程,就可以避免将SQL语句同ASP代码混杂在一起。这样做的好处至少有三个: 第一、大大提高效率。存储过程本身的执行速度非常快,而且,调用存储过程可以大大减少同数据库的交互次数。 第二、提高安全性。假如将SQL语句混合在ASP代码中,一旦代码失密,同时也就意味着库结构失密。 第三、有利于SQL语句的重用。 在ASP中,一般通过command对象调用存储过程,根据不同情况,本文也介绍其它调用方法。为了方便说明,根据存储过程的输入输出,作以下简单分类: 1. 只返回单一记录集的存储过程 假设有以下存储过程(本文的目的不在于讲述T-SQL语法,所以存储过程只给出代码,不作说明): /*SP1*/ CREATE PROCEDURE dbo.getUserList as set nocount on begin select * from dbo.userinfo end go 以上存储过程取得userinfo表中的所有记录,返回一个记录集。通过command对象调用该存储过程的ASP代码如下: *通过Command对象调用存储过程* DIM MyComm,MyRst Set MyComm = Server.CreateObject(ADODB.Command) MyComm.ActiveConnection = MyConStr MyConStr是数据库连接字串 MyComm.CommandText = getUserList 指定存储过程名 MyComm.CommandType = 4 表明这是一个存储过程 MyComm.Prepared = true 要求将SQL命令先行编译 Set MyRst = MyComm.Execute Set MyComm = Nothing 存储过程取得的记录集赋给MyRst,接下来,可以对MyRst进行操作。 在以上代码中,CommandType属性表明请求的类型,取值及说明如下: -1 表明CommandText参数的类型无法确定 1 表明CommandText是一般的命令类型 2 表明CommandText参数是一个存在的表名称 4 表明CommandText参数是一个存储过程的名称 还可以通过Connection对象或Recordset对象调用存储过程,方法分别如下: *通过Connection对象调用存储过程* DIM MyConn,MyRst Set MyConn = Server.CreateObject(ADODB.Connection) MyConn.open MyConStr MyConStr是数据库连接字串 Set MyRst = MyConn.Execute(getUserList,0,4) 最后一个参断含义同CommandType Set MyConn = Nothing *通过Recordset对象调用存储过程* DIM MyRst Set MyRst = Server.CreateObject(ADODB.Recordset) MyRst.open getUserList,MyConStr,0,1,4 MyConStr是数据库连接字串,最后一个参断含义与CommandType相同 2. 没有输入输出的存储过程 请看以下存储过程: /*SP2*/ CREATE PROCEDURE dbo.delUserAll as set nocount on begin delete from dbo.userinfo end go 该存储过程删去userinfo表中的所有记录,没有任何输入及输出,调用方法与上面讲过的基本相同,只是不用取得记录集: *通过Command对象调用存储过程* DIM MyComm Set MyComm = Server.CreateObject(ADODB.Command) MyComm.ActiveConnection = MyConStr MyConStr是数据库连接字串 MyComm.CommandText = delUserAll 指定存储过程名 MyComm.CommandType = 4 表明这是一个存储过程 MyComm.Prepared = true 要求将SQL命令先行编译 MyComm.Execute 此处不必再取得记录集 Set MyComm = Nothing 当然也可通过Connection对象或Recordset对象调用此类存储过程,不过建立Recordset对象是为了取得记录集,在没有返回记录集的情况下,还是利用Command对象吧。 3. 有返回值的存储过程 在进行类似SP2的操作时,应充分利用SQL Server强大的事务处理功能,以维护数据的一致性。并且,我们可能需要存储过程返回执行情况,为此,将SP2修改如下: /*SP3*/ CREATE PROCEDURE dbo.delUserAll as set nocount on begin BEGIN TRANSACTION delete from dbo.userinfo IF error=0 begin COMMIT TRANSACTION return 1 end ELSE begin ROLLBACK TRANSACTION return 0 end return end go 以上存储过程,在delete顺利执行时,返回1,否则返回0,并进行回滚操作。为了在ASP中取得返回值,需要利用Parameters集合来声明参数: *调用带有返回值的存储过程并取得返回值* DIM MyComm,MyPara Set MyComm = Server.CreateObject(ADODB.Command) MyComm.ActiveConnection = MyConStr MyConStr是数据库连接字串 MyComm.CommandText = delUserAll 指定存储过程名 MyComm.CommandType = 4 表明这是一个存储过程 MyComm.Prepared = true 要求将SQL命令先行编译 声明返回值 Set Mypara = MyComm.CreateParameter(RETURN,2,4) MyComm.Parameters.Append MyPara MyComm.Execute 取得返回值 DIM retValue retValue = MyComm(0) 或retValue = MyComm.Parameters(0) Set MyComm = Nothing 在MyComm.CreateParameter(RETURN,2,4)中,各参数的含义如下: 第一个参数(RETURE)为参数名。参数名可以任意设定,但一般应与存储过程中声明的参数名相同。此处是返回值,我习惯上设为RETURE; 第二个参数(2),表明该参数的数据类型,具体的类型代码请参阅ADO参考,以下给出常用的类型代码: adBigInt: 20 ; adBinary : 128 ; adBoolean: 11 ; adChar: 129 ; adDBTimeStamp: 135 ; adEmpty: 0 ; adInteger: 3 ; adSmallInt: 2 ; adTinyInt: 16 ; adVarChar: 200 ; 对于返回值,只能取整形,且-1到-99为保留值; 第三个参数(4),表明参数的性质,此处4表明这是一个返回值。此参数取值的说明如下: 0 : 类型无法确定; 1: 输入参数;2: 输入参数;3:输入或输出参数;4: 返回值 以上给出的ASP代码,应该说是完整的代码,也即最复杂的代码,其实 Set Mypara = MyComm.CreateParameter(RETURN,2,4) MyComm.Parameters.Append MyPara 可以简化为 MyComm.Parameters.Append MyComm.CreateParameter(RETURN,2,4) 甚至还可以继续简化,稍后会做说明。 对于带参数的存储过程,只能使用Command对象调用(也有资料说可通过Connection对象或Recordset对象调用,但我没有试成过)。 4. 有输入参数和输出参数的存储过程 返回值其实是一种特殊的输出参数。在大多数情况下,我们用到的是同时有输入及输出参数的存储过程,比如我们想取得用户信息表中,某ID用户的用户名,这时候,有一个输入参数-用户ID,和一个输出参数-用户名。实现这一功能的存储过程如下: /*SP4*/ CREATE PROCEDURE dbo.getUserName UserID int, UserName varchar(40) output as set nocount on begin if UserID is null return select UserName=username from dbo.userinfo题目11、学校图书馆借书信息管理系统建立三个表:学生信息表:student字段名称数据类型说明stuIDchar(10)学生编号,主键stuNameVarchar(10)学生名称majorVarchar(50)专业图书表:book字段名称数据类型说明BIDchar(10)图书编号,主键titlechar(50)书名authorchar(20)作者借书信息表:borrow字段名称数据类型说明borrowIDchar(10)借书编号,主键stuIDchar(10)学生编号,外键BIDchar(10)图书编号,外键T_timedatetime借书日期B_timedatetime还书日期请编写SQL语句完成以下的功能:1) 查询“计算机”专业学生在“2007-12-15”至“2008-1-8”时间段内借书的学生编号、学生名称、图书编号、图书名称、借出日期;参考查询结果如下图所示:2) 查询所有借过图书的学生编号、学生名称、专业;参考查询结果如下图所示:3) 查询借过作者为“安意如”的图书的学生姓名、图书名称、借出日期、归还日期;参考查询结果如下图所示:4) 查询目前借书但未归还图书的学生名称及未还图书数量;参考查询结果如下图所示:附加:建表语句:USE masterGO/*$建库$*/-检验数据库是否存在,如果为真,删除此数据库-IF exists(SELECT * FROM sysdatabases WHERE name=BOOK) DROP DATABASE BOOKGOCREATE DATABASE BOOKGO-建数据表-USE BOOKGOCREATE TABLE student -学生信息表( stuID CHAR(10) primary key, -学生编号 stuName CHAR(10) NOT NULL , -学生名称 major CHAR(50) NOT NULL -专业)GOCREATE TABLE book -图书表( BID CHAR(10) primary key, -图书编号 title CHAR(50) NOT NULL, -书名 author CHAR(20) NOT NULL, -作者)GOCREATE TABLE borrow -借书表( borrowID CHAR(10) primary key, -借书编号stuID CHAR(10) foreign key(stuID) references student(stuID), -学生编号BID CHAR(10) foreign key(BID) references book(BID),-图书编号 T_time datetime NOT NULL, -借出日期 B_time datetime -归还日期)GO-学生信息表中插入数据-INSERT INTO student(stuID,stuName,major)VALUES(1001,林林,计算机)INSERT INTO student(stuID,stuName,major)VALUES(1002,白杨,计算机)INSERT INTO student(stuID,stuName,major)VALUES(1003,虎子,英语)INSERT INTO student(stuID,stuName,major)VALUES(1004,北漂的雪,工商管理)INSERT INTO student(stuID,stuName,major)VALUES(1005,五月,数学)-图书信息表中插入数据-INSERT INTO book(BID,title,author)VALUES(B001,人生若只如初见,安意如)INSERT INTO book(BID,title,author)VALUES(B002,入学那天遇见你,晴空)INSERT INTO book(BID,title,author)VALUES(B003,感谢折磨你的人,如娜)INSERT INTO book(BID,title,author)VALUES(B004,我不是教你诈,刘庸)INSERT INTO book(BID,title,author)VALUES(B005,英语四级,白雪)-借书信息表中插入数据-INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES(T001,1001,B001,2007-12-26,null)INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES(T002,1004,B003,2008-1-5,null)INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES(T003,1005,B001,2007-10-8,2007-12-25)INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES(T004,1005,B002,2007-12-16,2008-1-7)INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES(T005,1002,B004,2007-12-22,null)INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES(T006,1005,B005,2008-1-6,null)INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES(T007,1002,B001,2007-9-11,null)INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES(T008,1005,B004,2007-12-10,null)INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES(T009,1004,B005,2007-10-16,2007-12-18)INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES(T010,1002,B002,2007-9-15,2008-1-5)INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES(T011,1004,B003,2007-12-28,null)INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES(T012,1002,B003,2007-12-30,null)标准答案:- 1)查询“计算机”专业学生在“2007-12-15”至“2008-1-8”时间段内借书的学生编号、学生名称、图书编号、图书名称、借出日期select 学生编号=stuID,学生名称=(select stuName from student where stuID=borrow.stuID),图书编号=BID,图书名称=(select title from book where BID=borrow.BID),借出日期=T_time from borrow where stuID in (select stuID from student where major=计算机) and T_time2007-12-15 and T_time2*(select count(*) from ProWage where Wage=PWage)update ProWage set total=total+AWage,Wage=Wage+AWageelsebreakendprint一共加薪:+convert(varchar,total)+元print加薪后的程序员工资列表:select * from ProWage-调用存储过程1-exec Sum_wage PWage=2000,AWage=100,total=0exec Sum_wage PWage=2200,AWage=100,total=0exec Sum_wage PWage=3000,AWage=100,total=0exec Sum_wage PWage=4000,AWage=100,total=0exec Sum_wage PWage=5000,AWage=100,total=0exec Sum_wage PWage=6000,AWage=100,total=0-2、创建存储过程2-if exists (select * from sysobjects where name=Avg_wage)drop procedure Avg_wageGOcreate procedure Avg_wage PWage int,AWage int,total intas while (1=1)beginif (select Avg(Wage) from ProWage)=PWage)update ProWage set total=total+AWage,Wage=Wage+AWageelsebreakendprint一共加薪:+convert(varchar,total)+元print加薪后的程序员工资列表:select * from ProWage-调用存储过程-exec Avg_wage PWage=3000,AWage=200,total=0exec Avg_wage PWage=4500,AWage=200,total=0题目3:学生成绩信息三个表,结构如下: 学生表:Member字段名称数据类型说明MIDChar(10)学生号,主键MNameChar(50)姓名课程表:字段名称数据类型说明FIDChar(10)课程,主键FNameChar(50)课程名成绩表:Score字段名称数据类型说明SIDint自动编号,主键,成绩记录号FIDChar(10)课程号,外键MIDChar(10)学生号,外键Scoreint成绩请编写T-SQL语句来实现如下功能:1) 查询各个学生语文、数学、英语、历史课程成绩,例如下表:姓名语文数学英语历史张萨78 678976王强 89 67 84 96李三70 87 92 56李四 8078 97662) 查询四门课中成绩低于70分的学生及相对应课程名和成绩。3) 统计各个学生参加考试课程的平均分,且按平均分数由高到底排序。4) 创建存储过程,分别查询参加1、2、3、4门考试及没有参加考试的学生名单,要求显示姓名、学号。建表语句:USE masterGO/*$建库$*/-检验数据库是否存在,如果为真,删除此数据库-IF exists(SELECT * FROM sysdatabases WHERE name=Student) DROP DATABASE StudentGOCREATE DATABASE StudentGO-建数据表-USE StudentGOCREATE TABLE Member -学生表( MID char(10) primary key, -学生号 MName CHAR(50) NOT NULL -姓名)GOCREATE TABLE F -课程表( FID char(10) primary key, -课程号FName CHAR(50) NOT NULL -课程名)GOCREATE TABLE score -学生成绩表( SID int identity(1,1) primary key, -成绩记录号 FID char(10) foreign key(FID) references F(FID) , -课程号 MID char(10) foreign key(MID) references Member(MID) , -学生号 Score int NOT NULL -成绩)GO-课程表中插入数据-INSERT INTO F(FID,FName)VALUES(F001,语文)INSERT INTO F(FID,FName)VALUES(F002,数学)INSERT INTO F(FID,FName)VALUES(F003,英语)INSERT INTO F(FID,FName)VALUES(F004,历史)-学生表中插入数据-INSERT INTO Member(MID,MName)VALUES(M001,张萨)INSERT INTO Member(MID,MName)VALUES(M002,王强)INSERT INTO Member(MID,MName)VALUES(M003,李三)INSERT INTO Member(MID,MName)VALUES(M004,李四)INSERT INTO Member(MID,MName)VALUES(M005,阳阳)INSERT INTO Member(MID,MName)VALUES(M006,虎子)INSERT INTO Member(MID,MName)VALUES(M007,夏雪)INSERT INTO Member(MID,MName)VALUES(M008,璐璐)INSERT INTO Member(MID,MName)VALUES(M009,珊珊)INSERT INTO Member(MID,MName)VALUES(M010,香奈儿)-成绩表中插入数据-INSERT INTO Score(FID,MID,Score)VALUES(F001,M001,78)INSERT INTO Score(FID,MID,Score)VALUES(F002,M001,67)INSERT INTO Score(FID,MID,Score)VALUES(F003,M001,89)INSERT INTO Score(FID,MID,Score)VALUES(F004,M001,76)INSERT INTO Score(FID,MID,Score)VALUES(F001,M002,89)INSERT INTO Score(FID,MID,Score)VALUES(F002,M002,67)INSERT INTO Score(FID,MID,Score)VALUES(F003,M002,84)INSERT INTO Score(FID,MID,Score)VALUES(F004,M002,96)INSERT INTO Score(FID,MID,Score)VALUES(F001,M003,70)INSERT INTO Score(FID,MID,Score)VALUES(F002,M003,87)INSERT INTO Score(FID,MID,Score)VALUES(F003,M003,92)INSERT INTO Score(FID,MID,Score)VALUES(F004,M003,56)INSERT INTO Score(FID,MID,Score)VALUES(F001,M004,80)INSERT INTO Score(FID,MID,Score)VALUES(F002,M004,78)INSERT INTO Score(FID,MID,Score)VALUES(F003,M004,97)INSERT INTO Score(FID,MID,Score)VALUES(F004,M004,66)INSERT INTO Score(FID,MID,Score)VALUES(F001,M006,88)INSERT INTO Score(FID,MID,Score)VALUES(F002,M006,55)INSERT INTO Score(FID,MID,Score)VALUES(F003,M006,86)INSERT INTO Score(FID,MID,Score)VALUES(F004,M006,79)INSERT INTO Score(FID,MID,Score)VALUES(F002,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论