实验名称: T-SQL程序设计与游标设计和用户自定义数据类型及自定义函数
实验目的:
1.掌握T-SQL语言及其程序设计方法
2.掌握T-SQL游标的使用方法
3.掌握用户定义数据类型的概念、创建及使用方法
4.掌握用户定义函数的概念、创建及使用方法
实验意义:
1.通过学习T-SQL语言编程,可以对于SQL Sever软件的理解更加深刻,对于SQL语句运用也可以更灵活。
2.通过游标的创建,在存储过程传递参数过程中可以一次传递多行表记录值,针对上次实验所存在传出打印数据覆盖的情况可以起到改善作用。
3.用户定义函数比较灵活,方便一些计算实现某一特定功能的代码进行打包,直接调用传出参数值,对程序设计更加具有灵活性。
实验内容:
- T-SQL程序设计逻辑
- 面向复杂T-SQL程序设计
- 创建并使用游标
- 创建、使用与删除用户定义数据类型
- 创建和使用用户定义函数
- 修改与删除用户定义函数
- 思考题
- 总结与心得体会
实验主要步骤:
一.T-SQL程序设计逻辑
1.T-SQL语句设计计算1-100之间所有能被3整除的个数的总和
在新建查询中先声明定义变量,再对变量进行赋值,最终按照以前所学C语言的逻辑流程进行程序设计,并且计数打印输出结果如下:
2.从学生中选取SNO、SN、SEX,如果为“男”则输出M,如果为“女”则输出F
对学生表进行查询操作,并且对于性别列SEX进行CASE操作,输出结果。
二.面向复杂T-SQL程序设计
1.从数据库中查询所有同学选课成绩情况:姓名、课程名、成绩。
并且按照成绩进行等级划分,最后先按SNO升序,再按CNO升序,最后按成绩降序排列。代码部分主要是成绩得分进行CASE判断,最后将成绩转化为等级进行输出。
2.给教师增加工资操作
给任2门课及以上且工资涨幅分为三个级别:400元以上涨300元;3000元以上涨200元;3000元以下涨100元。只任1门课程的涨工资50元。
通过对教师表进行CASE情况分析,依次选出任二门及以上课程和老师原本工资分类后 ,按照T表中教师号是否在该对于范围情况内,依次给薪水数据进行更新操作,代码如下:
以下是教师表中涨工资前数据:
以下是教师表中涨工资后数据:
三.创建并使用游标
1.定义一个游标。
要求该游标返回所有女同学基本信息,在游标中查找并显示牛莉的记录。
首先声明变量学号、姓名、性别年龄等基本信息,再声明游标变量并指向S表中的学生基本信息。接下来打开游标,并将游标向后指向新定义的几个变量中,相当于每次查找到表中信息时对应赋值给几个变量中。
接下来是查询并打印出所有女同学的基本信息,按照游标中的@SEX性别是否等于“女”进行查询,并且在查询中当游标返回值为空时,打印出未查询到性别为女的同学,查询结束。最终将游标的空间进行释放。
2.创建一个存储过程Pro_C
返回一个包含所有选修数据课程的学生姓名和成绩的游标,利用该存储过程,通过学生姓名查找学生赵就是否选择定位原理的课程,若选择,则给出课程的成绩。
首先创建存储过程如下,存储过程主要是先定义一个输出游标类型的变量@CURSOR,接下来是对游标进行赋值对应,将游标赋值对应为查询选择所选课程名为“定位原理”课程的学生姓名与成绩,最后将游标打开。
接下来是调用该存储过程,首先定义声明各种变量的类型与存储空间,并将学生姓名赋值为“赵就”,通过游标遍历选课表,查找赵就同学的所选定位原理的成绩,调用存储过程,并且将游标存入当前所定义变量,接下来判断当前游标所指位置是否为空值,若不为空值,则判断选课表中学生姓名为赵就的情况下的成绩进行输出;若游标所指位置为空值,则输出该同学未选修“定位原理”课程。最终将游标关闭,并将空间进行释放。
四.创建、使用与删除用户定义数据类型
1.创建和使用用户定义的数据类型Idnum
采用T-SQL语句进行创建,并且确定数据类型的存储空间以及是否可以为空值。
在对象资源管理器中刷新后即可看到用户定义数据类型如下:
2.交互式创建、修改用户定义数据类型Nameperson
在对象资源管理器中,找到用户自定义数据类型,右击点击新建,并对新建数据类型设置名称、数据类型、长度、是否可以为空值、存储字节等信息。修改方法同上。
3.创建T-SQL程序,创建学生数据表STUDENT和教师表TEACHER
4.T-SQL程序修改学生表中的属性列SN与教师表中属性列TN的数据类型
将其修改成用户自定义数据类型Nameperson
5.T-SQL语句删除用户定义数据类型
首先先将待删除的用户定义数据类型所被用的表中该数据类型切换为其他数据类型
采用T-SQL语句将该数据类型进行删除
2.采用交互式方法删除用户定义数据类型IDNUM
在对象资源管理器中找到后,右击并将其删除。
五.创建和使用用户定义函数
1.交互式创建标量函数Score_FUN
在对象资源管理器中找到“函数”,并右击下边的“标量值函数”,点击“新建标量值函数”选项,在弹出的函数模板中进行修改SQL语句。
根据学生姓名与课程名查询成绩。并在函数中首先声明返回值的数据类型,最后设定返回值。
2.调用标量函数
通过EXEC调用函数,并将提前声明好的变量值赋值函数调用结果,最终将结果打印出来。
3.T-SQL语句创建内嵌表值函数
根据学生姓名查询该生所有选课成绩
因此需要设定返回值类型为表类型,通过输入学生的姓名,最后将整个选择表结果进行返回。程序截图如下:
4.调用内嵌表值函数
5.用T-SQL语句创建一个多语句函数
根据课程名查询所有选择该课程学生的成绩信息,并按照成绩进行降序排列。
首先声明返回值类型为表结构,并且为新定义的表结构,声明表结构的类型,在函数中,对表中数据进行插入操作,插入S、SC、C表中的查询语句结构,最终将该新建表进行返回。
5.调用函数。直接对函数进行选择,因为函数返回结果已经是一个表结构,可以对返回结果直接进行查询操作。
六.修改和删除函数
1.交互式修改函数
直接右击函数名称,选择修改,将成绩转换为等级输出。
调用函数,并输出调用结果:
2.SQL语句修改函数
增加输出列对应成绩的等级
调用函数,并且输出结果如下:
3.交互式删除函数
4.T-SQL语句删除函数
七.思考题
1.T-SQL编程计算1!+2!+…+100!的结果
需要注意计算过程的类型,若采用整型进行计算,则会出现溢出的错误,因此需要采用科学计数法的方式将其结果保留小数位数,进而计算出较精确的结果。
2.设计函数,通过两地经纬度直接计算出两地的真实距离(仅输入未知点的经纬度)。
设计函数如下:
实验总结与实验注意事项:
1.曲面上两点之间距离的计算:
首先对于思考题的第二题通过两点的经纬度计算出两点真实距离这一问题,进行公式推导,基于地球是个球体,因此两点的经纬度计算距离即求得是曲线距离,因此在地球半径已知的情况下,仅仅通过计算已知点在球体上的直线距离,即可推算出两点地心的夹角,进而推导出两点的曲线距离,即为两点在地球上的真实距离。
因此需要先计算两点的直线距离,以地球地心为远点建立三维坐标系,0°子午线为x轴,赤道面内垂直0°子午线为y轴,指向北极方向为z轴。通过两点的三维坐标差即可计算出直线距离,并基于纬度差首先可以计算出z方向上的坐标差,再通过纬度值的角,将两点投影到赤道平面内再根据各自的经度值即可计算出x和y方向上的坐标差,通过三维空间坐标系中两点距离公式即可计算出两点直线距离。
最后根据直线距离与角度和半径的关系,推导出曲线距离,即为真实的距离。
2.通过导入多个城市经纬度信息,校验该函数的计算效果
首先将网上下载到的湖北省多个城市的经纬度信息导入到EXCEL表格中,再通过EXCEL表格导入到SQL Server数据库中。
显示导入成功:
接下来需要对数据库中的各个城市信息进行编号,目的是方便通过编号对各个城市进行遍历,并且可以比较多个城市相对于某个点的距离(也可以通过游标实现)。
增加标号并且增加距离列,距离列存储待计算与已知点之间距离的值。
添加完成后,最终在数据库中可以显示出部分湖北省各市区的经纬度,ID号与距离已知点距离(目前为空值)。
3.计算距离并筛选出与已知点相距小于30km的点
接下来调用函数,在未采用游标的情况下依次计算与已知点距离,存入DIS中,并选出距离已知点真实距离小于30km的市区,并按距离升序排列,将结果输出打印至结果中。
最后可以在总的市区表中查看到距离DIS的值,该距离即为相距已知点的真实距离。
4.修改调用,采用游标的方式依然可以实现逐个对市区经纬度表进行遍历的操作
代码如下:
5.注意事项:
(1)游标的使用是仅能沿某一方向不停遍历,因此若想让游标遍历结束后回到初始点,可以采用先将游标关闭,再重新打开并且指向初始声明的值,继续往下遍历即可实现重头遍历的效果。
(2)在进行T-SQL编程前首先要估算一下计算结果,如果明显不满足某种数据存储类型,需要提前修改数据类型,或者采用强制转换等方式进行显示结果。
(3)在删除用户自定义数据类型前,需要提前注意到哪些表用了该种数据类型,并将该表的这种数据类型修改成其他数据类型后,才能对这种用户自定义数据类型进行修改,否则会出现错误。
(4)函数与存储过程一大区别:相比与存储过程,函数必须要返回结果,因此在调用函数时需要提前知道函数返回结果的数据类型,若为表数据类型,可以之间对返回结果进行表的查询等类似操作,使程序的代码更简洁,并且函数重点突出其某一特定的功能的实现。