实验4 T-SQL语言
实验目的:
掌握Transact-SQL语言中的变量、运算符、函数; 掌握Transact-SQL语句编写批处理和流程控制程序。 掌握游标的创建,打开,数据读取,关闭,销毁的基本方法
实验内容和步骤:
Transact-SQL语言是在SQL Server 2005 中使用的程序设计语言。不但包含了标准SQL语言部分,而且为了满足实际应用中的编程需要,在Transact-SQL语言中还另外增加了一些语言要素,它们包括注释、变量、运算符、函数和流程控制语句等。
所有的语句都在查询分析器中执行。
1. Transact-SQL语句
实验内容1: 返回在程序执行过程中上一条SQL语句影响的记录数(全局变量@@ROWCOUNT),注意观察结果窗口。
use test
go
select * from Student
select @@rowcount as 第一次查询返回的记录数
实验内容2: 查询学生表的人数,将返回的记录数赋给局部变量@Rows
declare @count int set @count=(
select count(*) from Student )
select @count as '返回的记录数'
实验内容3: 设置一个局部变量为表,进行插入和查询操作
declare @t table (
id int primary key, name char(50) )
insert into @t values(1001,'hello kitty') insert into @t values(1002,'rabbit') select * from @t
实验内容4:(练习,自己试着写一下)设置一个局部变量其值为选修了课程的人数,并显示
提示:
select * from SC declare @row int
set @row=(select count(distinct Sno) from SC)
select @row as 选课人数
实验内容5:检查sysdatabases中的每一个数据库,使用数据库标识号来确定数据库名称。
use master go
select dbid,name as DB_NAME from sysdatabases
实验内容6:从数据库中返回学生表的第2列的名称
use test go
declare @学生表int
set @学生表=object_id('Student')
select col_name(@学生表,2) as 学生表中第列的名称
实验内容7:简单年、月、日函数
select month('11/28/2013'),day('11/28/2013'),year('11/28/2013')
实验内容8:从系统当前日期中返回系统当前的年份数、月份数和天数。
select month(getdate()) as 月,day(getdate()) 日,year(getdate()) 年
实验内容9:自己编写函数。编写一个函数,名称为“函数_学生选课数”,要求根据输入的学生学号,求此学生的选课数。 create function 函数_学生选课数( @xh as char(10) )
returns int begin
declare @选课数as int
select @选课数=count(Cno) from SC where Sno=@xh return @选课数 end go
select distinct Student.Sno,Sname,选课数=dbo.函数_学生选课数(SC.Sno) from Student,SC
where Student.Sno=SC.Sno
实验内容10: (练习,自己试着写一下)练习自定义函数,求每门课程的选课人数
提示
create function 函数_选课人数 (
@Cno as char(10) )
returns int begin
declare @选课人数as int
select @选课人数=count(Sno) from SC where Cno=@Cno return @选课人数 end go
select distinct
Course.Cno ,Cname ,选课人数=dbo. 函数_选课人数(SC.Cno) FROM Course,SC
WHERE Course.cno=SC.Cno GO
--使用自定义函数,通过左外连接,保留了左边被舍弃的元组 SELECT DISTINCT
Course.Cno ,Cname ,选课人数=dbo. 函数_选课人数(SC.Cno) FROM Course left join SC on Course.cno=SC.Cno
GO
2. 游标的创建和使用
游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次以行或者多行前进或向后浏览数据的能力。我们可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。
T-SQL游标:该游标是基于Declare Cursor 语法,主要用于Transaction-SQL脚本、存储过程以及触发器中。Transaction-SQL游标在服务器处理由客户端发送到服务器的Transaction-SQL语句。
使用游标要遵循以下顺序:声明游标→打开游标→读取数据→关闭游标→删除游标。 1.声明游标
实验内容1:以下是一个符合SQL-92标准的游标声明,此游标是只读的,只能从头到尾顺序提取数据。
declare s1 cursor for
select * from Student
for read only
实验内容2:以下是一个符合T-SQL扩展的游标声明,此游标是动态游标,可前后滚动,可对姓名列进行修改。 declare s2 cursor scroll dynamic for
select * from Student for update of Sname
2. 打开游标
声明游标之后,要使用游标提取数据,必须先打开游标。使用OPEN语句可以打开游标。打开游标后,可以使用全局变量@@CURSOR_ROWS查看游标中数据行的数目。 实验内容3:打开游标S_CUR1,输出其行数 open s1
select '游标s_cur1的数据行数'=@@CURSOR_ROWS
注意:通过联机丛书来查询@@CURSOR_ROWS,来理解其值的含义 3.读取数据
游标打开后,就可以使用FETCH命令从中读取数据。具体语句格式见联机丛书。 实验内容4:从游标S_CUR1中提取数据,只能用NEXT提取数据。 fetch next from s1
提示:选中该语句,点击执行,查看结果。再点击执行,查看结果。重复执行。
实验内容5:从游标S_CUR2中提取数据:
OPEN s2 --读取游标第一行 fetch first from s2
--读取下一行 fetch next from s2
--读取上一行 fetch prior from s2
--读取最后一行 fetch last from s2
--读取当前行的上二行 fetch relative-2 from s2
4.关闭游标
游标使用完后,要及时关闭游标,以释放当前的结果集并解除定位在该游标记录行上的游标锁定。
实验内容6:关闭游标S_CUR1
close s1
5.删除游标
关闭一个游标后,其数据结构仍存储在系统中,需要的时候仍然可以再次使用OPEN语句打开和使用该游标。如果确定以后不再使用该游标,则可以删除游标,将游标占用的系统空间释放出来。
实验内容7:删除游标S_CUR1 deallocate s1
3. 收获体会
在这次做实验中,总体来讲还是比较顺利的,我学会了几种函数的用法,比如如何利用函数去求当前的年月日,以及如何向函数中传递参数,这次的实验让我学会了不少。