SQL Server实战六:T-SQL、游标、存储过程的操作
本文介绍基于Microsoft SQL Server软件,实现数据库T-SQL语言程序设计,以及游标的定义、使用与存储过程的创建、信息查找的方法。
系列文章中示例数据来源于《SQL Server实验指导(2005版)》一书。依据本系列文章的思想与对操作步骤、代码的详细解释,大家用自己手头的数据,可以将相关操作与分析过程加以完整重现。
1 计算1-100间所有可被3整除的数的个数与总和
(1) 启动Microsoft SQL Server 2008 R2软件;
(2) 在“对象资源管理器”窗格中,在“数据库”处右键,在弹出的菜单中选择“附加”选项;
(3) 选择需要加以附加的jxsk数据库物理文件,选择定位文件夹“G:\sql\chutianjia sql”并选择对应数据库jxsk的物理文件并选择“确定”按钮,再次选择“确定”即可;
(4) 单击屏幕上方 “工具栏”菜单中的“新建查询”按钮,打开“查询编辑器”窗口,并在“查询编辑器”窗口中输入以下T-SQL语句:
DECLARE @SUM SMALLINT, @I SMALLINT,@NUMS SMALLINT
SET @SUM=0
SET @I=1
SET @NUMS=0
WHILE (@I<=100)
BEGIN
IF (@I% 3=0)
BEGIN
SET @SUM=@SUM+@I
SET @NUMS=@NUMS+1
END
SET @I=@I+1
END
PRINT'总和是'+STR(@SUM)
PRINT'个数是'+STR(@NUMS)
(5) 单击“工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;

2 从学生表S中选取SNO、SN、SEX,若为“男”输出M,为“女”输出F
(1) 单击屏幕上方 “工具栏”菜单中的“新建查询”按钮,打开“查询编辑器”窗口,并在“查询编辑器”窗口中输入以下T-SQL语句:
USE jxsk
GO
SELECT SNO AS 学号, SN AS 姓名,
性别=
CASE SEX
WHEN '男' THEN 'M'
WHEN '女' THEN 'F'
END
FROM S
GO
(2) 单击 “工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;

(3) 首次运行后发现结果中“性别”一栏均为“NULL”,与预期将达到的结果不一致。通过检查发现自己的T-SQL语句中出现错误,更改后效果如下图;

3 面向复杂应用的T-SQL程序设计方法——查询所有同学选课信息:姓名、课程名、成绩
(1) 单击屏幕上方 “工具栏”菜单中的“新建查询”按钮,打开“查询编辑器”窗口,并在“查询编辑器”窗口中输入以下T-SQL语句:
USE jxsk
GO
SELECT SN AS 姓名, CN AS 课程名,
成绩=
CASE
WHEN SCORE IS NULL THEN '未考'
WHEN SCORE<60 THEN '不及格'
WHEN SCORE>=60 AND SCORE<70 THEN '及格'
WHEN SCORE>=70 AND SCORE<80 THEN '中'
WHEN SCORE>=80 AND SCORE<90 THEN '良好'
WHEN SCORE>=90 THEN '优'
END
FROM SC,S,C
WHERE S.SNO=SC.SNO AND C.CNO=SC.CNO
ORDER BY S.SNO,C.CNO,SCORE DESC
GO
(2) 单击 “工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;

(3) 首次运行后发现系统报错。通过检查发现自己的T-SQL语句中出现错误,即丢失了CASE,更改后效果如下图;

4 面向复杂应用的T-SQL程序设计方法——为教师增加工资
(1) 在“对象资源管理器”中选择“数据库”→“jxsk”→“表”→“dbo.T”,右击并在弹出的窗口中选择“编辑前200行”;查看各教师的工资情况;
(2) 单击屏幕上方 “工具栏”菜单中的“新建查询”按钮,打开“查询编辑器”窗口,并在“查询编辑器”窗口中输入以下T-SQL语句:
USE jxsk
UPDATE T SET SAL=SAL+
CASE
WHEN T.TNO IN (
SELECT TC.TNO FROM T,TC
WHERE T.TNO=TC.TNO AND (SAL+COMM)>=4000
GROUP BY TC.TNO HAVING COUNT(*)>=2) THEN 300
WHEN T.TNO IN (
SELECT TC.TNO FROM T,TC
WHERE T.TNO=TC.TNO AND (SAL+COMM)>=3000 AND (SAL+COMM)<4000
GROUP BY TC.TNO HAVING COUNT(*)>=2) THEN 200
WHEN T.TNO IN (
SELECT TC.TNO FROM T,TC
WHERE T.TNO=TC.TNO AND (T.SAL+T.COMM<3000)
GROUP BY TC.TNO HAVING COUNT(*)>=2) THEN 100
WHEN T.TNO IN (
SELECT TC.TNO FROM T,TC
WHERE T.TNO=TC.TNO
GROUP BY TC.TNO HAVING COUNT(*)=1) THEN 50
ELSE 0
END
GO
(3) 单击 “工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;

(4) 首次运行后发现系统报错。通过系统内部提示,考虑到该错误应为上节实验课所设立的触发器对该数据库表修改加以限制,使得语句无法执行;
(5) 在“对象资源管理器”中选择“数据库”→“jxsk”→“表”→“dbo.T”→“触发器”,右键选中已存在的触发器,在弹出的对话框中选择“禁用”或“删除”;考虑到今后实验可能仍然会使用到这一触发器,我选择了“禁用”按钮,如下图;

(6) 更改完毕后单击 “工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;

(7) 在“对象资源管理器”中选择“数据库”→“jxsk”→“表”→“dbo.T”,右击并在弹出的窗口中选择“编辑前200行”;查看各教师的工资情况已发生变化,如下图;

5 使用游标——定义游标Cursor_Famale
(1) 单击屏幕上方 “工具栏”菜单中的“新建查询”按钮,打开“查询编辑器”窗口,并在“查询编辑器”窗口中输入以下T-SQL语句:
DECLARE @SNO CHAR(6),@SNAME CHAR(8),@SEX CHAR(2),
@AGE TINYINT,@DEPT CHAR(10)
DECLARE CURSOR_FAMALE CURSOR
FOR SELECT SNO,SN,SEX,AGE,DEPT FROM S
OPEN CURSOR_FAMALE
FETCH NEXT FROM CURSOR_FAMALE
INTO @SNO,@SNAME,@SEX,@AGE,@DEPT
WHILE @@FETCH_STATUS=0
BEGIN
IF @SNAME='牛莉'
BEGIN
PRINT '找到牛莉的信息如下'
PRINT @SNO+''+@SNAME+''+@SEX+''+
CONVERT (CHAR(2),@AGE)+''+@DEPT
BREAK
END
FETCH NEXT FROM CURSOR_FAMALE
INTO @SNO,@SNAME,@SEX,@AGE,@DEPT
END
IF @@FETCH_STATUS !=0
PRINT '很抱歉,没有找到牛莉的信息!'
CLOSE CURSOR_FAMALE
DEALLOCATE CURSOR_FAMALE
(2) 单击 “工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;

(3) 由于我的数据库表S中并没有学生“牛莉”的信息,因此在执行上述语言后系统提示“很抱歉,没有找到牛莉的信息!”;
(4) 对数据库表S中信息加以修改,增添学生“牛莉”的信息后,单击 “工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;

6 使用游标——创建存储过程Pro_C查找信息
(1) 单击屏幕上方 “工具栏”菜单中的“新建查询”按钮,打开“查询编辑器”窗口,并在“查询编辑器”窗口中输入以下T-SQL语句:
CREATE PROCEDURE PRO_C @C_CURSOR CURSOR VARYING OUTPUT
AS
SET @C_CURSOR = CURSOR
FOR
SELECT SNAME,SCORE FROM STUDENT,SC,COURSE
WHERE STUDENT.SNO=SC.SNO AND SC.CNO=COURSE.CNO AND COURSE.CNAME='数据库'
OPEN @C_CURSOR
(2) 单击 “工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;

(3) 首次运行后发现系统报错。通过系统内部提示,考虑到该错误应为@符号后的空格导致,修改后单击 “工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;

(4) 单击屏幕上方 “工具栏”菜单中的“新建查询”按钮,打开“查询编辑器”窗口,并在“查询编辑器”窗口中输入以下T-SQL语句:
DECLARE @MYCURSOR CURSOR
DECLARE @NAME VARCHAR(30)
DECLARE @IN_NAME CHAR(8)
DECLARE @SCORE INT
SELECT @IN_NAME = '王一山'
EXECUTE PRO_C @C_CURSOR = @MYCURSOR OUTPUT
FETCH NEXT FROM @MYCURSOR INTO @NAME,@SCORE
WHILE (@@FETCH_STATUS=0)
BEGIN
IF @NAME=@IN_NAME
BEGIN
PRINT @NAME+'选修了数据库课程,成绩是:'+CONVERT(CHAR(2), @SCORE)
BREAK
END
FETCH NEXT FROM @MYCURSOR INTO @NAME, @SCORE
END
IF (@@FETCH_STATUS!=0)
PRINT @IN_NAME+'没有选修数据库课程。'
CLOSE @MYCURSOR
DEALLOCATE @MYCURSOR
(5) 单击 “工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;

(6) 首次运行后发现系统报错。在语句处搜寻、更改但仍有错误,且错误甚至越来越多,如下图;

(7) 此时利用系统错误提示,考虑到可能是上述存储过程Pro_C构建出现错误;返回并对这一步骤加以检查,发现其T-SQL语言中数据库表与我个人数据库表名称、列名有不一致的地方,对其加以修改并单击 “工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;其中,修改之后的T-SQL语言为:
CREATE PROCEDURE PRO_C @C_CURSOR CURSOR VARYING OUTPUT
AS
SET @C_CURSOR = CURSOR
FOR
SELECT SN,SCORE FROM S,SC,C
WHERE S.SNO=SC.SNO AND SC.CNO=C.CNO AND C.CN='数据库'
OPEN @C_CURSOR

(8) 更改错误后发现仍有错误——存储过程Pro_C本已在上述步骤中建立完成,不可重复建立。因此在“对象资源管理器”中选择“数据库”→“jxsk”→“可编程性”→“存储过程”中选择Pro_C并右键,在弹出的窗口中选择“删除”;
(9) 删除后单击 “工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;

(10) 此时再对“王一山”的信息加以查询,即可成功实现,如下图;

(11) 由于我的数据库表S中并没有学生“牛莉”的信息,因此在执行上述语言后系统提示“没有选修数据库课程。”;我在S表、SC表增加了王一山及其选课数据,如下图;再次查询实现如下结果,如下下图;


至此,大功告成。
SQL Server实战六:T-SQL、游标、存储过程的操作的更多相关文章
- 刷新SQL Server所有视图、函数、存储过程 更多 sql 此脚本用于在删除或添加字段时刷新相关视图,并检查视图、函数、存储过程有效性。 [SQL]代码 --视图、存储过程、函数名称 DECLARE @NAME NVARCHAR(255); --局部游标 DECLARE @CUR CURSOR --自动修改未上状态为旷课 SET @CUR=CURSOR SCROLL DYNAMIC FO
刷新SQL Server所有视图.函数.存储过程 更多 sql 此脚本用于在删除或添加字段时刷新相关视图,并检查视图.函数.存储过程有效性. [SQL]代码 --视图.存储过程.函数名称 DE ...
- 刷新SQL Server所有视图、函数、存储过程
刷新SQL Server所有视图.函数.存储过程 更多 sql 此脚本用于在删除或添加字段时刷新相关视图,并检查视图.函数.存储过程有效性. [SQL]代码 --视图.存储过程.函数名称 DE ...
- SQL Server 内存泄露(memory leak)——游标导致的内存问题
原文:SQL Server 内存泄露(memory leak)--游标导致的内存问题 转自:http://blogs.msdn.com/b/apgcdsd/archive/2011/07/01/sql ...
- sql server 查询某个表被哪些存储过程调用
sql server 查询某个表被哪些存储过程调用 select distinct object_name(id) from syscomments where id in (select id fr ...
- 如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集?
如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集?(2006-12-14 09:25:36) 与这个问题具有相同性质的其他描述还包括:如何 ...
- 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效
数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...
- 如何在SQL Server中生成和使用CRUD存储过程
在本文中,请参阅如何在SQL Server中生成和使用CRUD存储过程. 大多数数据库系统基于缩写CRUD调用的最简单的4种数据操作操作进行操作. 此首字母缩写词代表CREATE,READ,UPDAT ...
- 迁移 SQL Server 数据库到 Azure SQL 实战
最近有个维护的项目需要把 SQL Server 2012 的数据库迁移到 Azure SQL 上去,迁移过程可谓一波三折,故在此分享这次迁移中碰到的点点滴滴,希望对朋友们有所帮助. 文章来源:葡萄城产 ...
- 使用CASE表达式替代SQL Server中的动态SQL
原文:使用CASE表达式替代SQL Server中的动态SQL 翻译自: http://www.mssqltips.com/sqlservertip/1455/using-the-case-expre ...
- 【转】SQL Server 运行状况监控SQL语句
SQL Server 运行状况监控SQL语句 Microsoft SQL Server 2005 提供了一些工具来监控数据库.方法之一是动态管理视图.动态管理视图 (DMV) 和动态管理函数 (D ...
随机推荐
- HTTP编码和解码与基本认证
咱们在计算机屏幕上看到的是实体化的文字,而在计算机存储介质中存放的实际是二进制的比特流.那么在这二者之间的转换规则就须要一个统一的标准,不然把计算机上文档就乱码了:因而为了实现转换标准,各类字符集标准 ...
- 性能对比 Go、Python、Perl、Ruby、Rust、C/C++、PHP、Node.js、Java.. 等多编
1. 有人说 Python 性能没那么 Low? 这个我用 pypy 2.7 确认了下,确实没那么差, 如果用 NumPy 或 其它版本 Python 的话,性能更快.但 pypy 还不完善,pypy ...
- 新前言with留言板
旧博客也是会用的,但是现在只用博客园写博客,平时csdn的东西也会凑凑热闹 欢迎各位julao来留言板留言 /* ID:lemondi1 LANG:C++ TASK:test */ #include ...
- #差分,前缀和#nssl 1469 U
分析 考虑离线,因为异或和很难在线处理 然后可以用两个数组来差分斜与横的情况,然后将答案竖着传 时间复杂度\(O(n^2)\) 代码 #include <cstdio> #include ...
- #dp#C 公共子序列
题目 给定两个字符串\(s1,s2\),求它们的\(LCS\) 满足\(|s1|\leq 10^6,|s2|\leq 10^3\) 分析 考场写了\(O(|s1|*|s2|)\)成功TLE, 考虑突破 ...
- OpenHarmony 3.2 Beta多媒体系列——视频录制
一.简介 媒体子系统为开发者提供了媒体相关的很多功能,本文针对其中的视频录制功能做个详细的介绍.首先,我将通过媒体子系统提供的视频录制Test代码作为切入点,给大家梳理一下整个录制的流程. 二.目录 ...
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit
1.问题描述 升级到4.0.0.59版本后,通过pushService.getToken获取华为的token时报如下错误:Illegal application identity. 解决方案 Mate ...
- K8S 性能优化 - K8S APIServer 调优
前言 K8S 性能优化系列文章,本文为第二篇:Kubernetes API Server 性能优化参数最佳实践. 系列文章: <K8S 性能优化 - OS sysctl 调优> 参数一览 ...
- DevEco Device Tool 3.1 Release新版本发布,新增资源管理器、SFTP、HDC
原文链接:https://mp.weixin.qq.com/s/UGBirjf8nBjnfKck9TlyWg,点击链接查看更多技术内容: DevEco Device Tool是面向智能设备开发者 ...
- HarmonyOS极客松“上分秘籍”! 高手们顶峰相见!
HarmonyOS 极客马拉松2023 火热进行中,我们期待与各位开发者相聚一起,践行极客精神,创造无限可能! 我们鼓励各位极客们自由组队,挥洒创意,用HarmonyOS 探索移动应用和服务的更多 ...