SQL Server:流程控制语言详解

这篇具有很好参考价值的文章主要介绍了SQL Server:流程控制语言详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SQL Server:流程控制语言详解,# SQL Server,数据库,sql,sqlserver
SQL Server:流程控制语言详解,# SQL Server,数据库,sql,sqlserver

一、批处理、脚本和变量

局部变量和全局变量

1、局部变量

局部变量是以@开头的用户定义的变量,用declare语句声明

(1)局部变量的命名

DECLARE  <局部变量名1><数据类型1> [ , <局部变量名2><数据类型2>,]

(2)局部变量的赋值

SET  <局部变量名>= <表达式>

例1:在同一批中先声明二个变量,并为它们赋值,然后将它们用到SELECT语句的WHERE子句中。

Use  teaching
GO
- - 声明二个局部变量
DECLARE @student_name  varchar(20) , 
        @student_birthday  datetime
-- 对二个局部变量赋值
SET  @student_name = '杨涛'
SET  @student_birthday =2001-01-01'
-- 根据这二个局部变量的值进行查询
SELECT  sno, sname, birthday
FROM  student
WHERE  sname=@student_name  or 
       birthday=@student_birthday
GO

2、全局变量

全局变量是以@@开头的SQL Server系统提供并赋值的变量

【注】

  1. 用户不能建立全局变量
  2. 也不能用SET语句来修改全局变量的值
  3. 但可以将全局变量的值赋给局部变量,以便保存和处理

例2:应用三个全局变量的例子

 /* 第一类全局变量 */
-- @@rowcount表示最近一个语句影响的行数
PRINT  @@rowcount
-- @@error保存最近执行操作的错误状态
PRINT  @@error
/* 第二类全局变量 */
-- @@version表示SQL Server的版本信息
PRINT @@version

例3:将全局变量的值赋给局部变量,请读者利用在线帮助来理解@@MAX_PRECISION的含义

DECLARE  @max_p   tinyint
SET @max_p = @@MAX_PRECISION
PRINT @max_p

二、顺序、分支和循环结构语句

1、程序注释语句

① 注释语句的作用

(1)说明代码的含义;

(2)注释掉程序中暂时不用的语句;

② 注释语句的种类

(1)- -(两个减号):用于注释单行;

(2)/……/:用于注释多行;

2、BEGIN┅END语句块

BEGIN
	<T-SQL语句序列>
END

3、IF┅ELSE语句

IF  <逻辑表达式>
    <T-SQL语句序列1>
[ELSE
    <T-SQL语句序列2>]

例4:请读者仔细阅读下列程序,并理解其含义。

Use  teaching
  GO
  IF EXISTS (select *  from student_course  where cno='10101' )
    BEGIN 
      PRINT  '存在选修10101号课程的选课记录!'
      select  cno, avg(grade)  from student_course  
      where cno='10101'    group by cno
    END
  ELSE
    PRINT  '不存在选修10101号课程的选课记录!'
  GO
  IF(select avg(grade)from student_course where 
           cno='10101')>80
    BEGIN 
      PRINT  '选修10101号课程学生的平均成绩大于80分!'
      Select s.sno,sname from student s,student_course sc
        Where  s.sno=sc.sno and cno='10101' and grade>=85
    END
  ELSE
    PRINT  '选修10101号课程学生的平均成绩小于等于80分!'
  GO

4、CASE语句

【语句格式1】:根据多个选择来确定执行的内容 —— 类似于C语言中的switch...case

CASE  <条件判断表达式>
   WHEN <比较表达式1> THEN <结果表达式1>
  [WHEN <比较表达式2> THEN <结果表达式2> 
            ………
   WHEN <比较表达式n> THEN <结果表达式n>] 
  [ELSE  <结果表达式q>] 
END

例5:使用CASE语句格式1的例子

Use Teaching
GO
Select  Sno  as  '学号' , sname  as  '姓名' ,
 CASE  dept	-- 根据属性进行划分
    WHEN '电子系' THEN '是来自电子系学生’
    WHEN '计算机系' THEN '是来自计算机系学生'
    WHEN '信息系' THEN '是来自信息系学生'
    WHEN '机械系' THEN '是来自机械系学生'
    ELSE '是来自其它系的学生'
 END   as  '系名'
From student
Order  by  dept
GO

【语句格式2】:依次判断where后的<逻辑表达式1>是否为TRUE,若是的话则执行后面的 结果表达式

CASE
 WHEN <逻辑表达式1> THEN <结果表达式1>
[WHEN <逻辑表达式2> THEN <结果表达式2> 
               ………
 WHEN <逻辑表达式n> THEN <结果表达式n>] 
 [ELSE  <结果表达式q>] 
END

例6:使用CASE语句格式2的例子

Use Teaching
GO
Select sc.sno  as  '学号', sname  as  '姓名' ,
           sc.cno  as  '课程号', cname  as  '课程名',
   CASE 
         WHEN  grade>=90  THEN  '优秀'
         WHEN  grade>=80  THEN  '良好'
         WHEN  grade>=70  THEN  '中等'
         WHEN  grade>=60  THEN  '及格' 
        ELSE  '不及格'
    END  as  '成绩'
from student  s, student_course  sc, course  c
where  s.sno=sc.sno  and  sc.cno=c.cno
order by  s.sno
go

5、WHILE语句

使用WHILE可以在条件成立的时候重复执行一条或多条T-SQL语句

WHILE <逻辑表达式>
	<T-SQL语句序列>  

注:与IF…ELSE语句一样,WHILE语句只能执行一条T-SQL语句,如果希望包含多条T-SQL语句,就应该使用BEGIN…ENG结构

例7:计算s = 1+2+3+…+99+100的和

  DECLARE  @x  int , @s  int
  SET @s=0
  SET @x=1
  WHILE @x<=100
     BEGIN
           SET @s=@s+@x
           SET @x=@x+1
     END
  PRINT  'S='+convert(char(4) , @s )
  GO
-- 其中convert (char(4) , @s )为转换数据类型的函数

6、BREAK和CONTINUE语句

BREAK语句

BREAK语句用于退出最内层的WHILE循环

WHILE <逻辑表达式>
    <T-SQL语句序列1>
        BREAK
    <T-SQL语句序列2>

例8:利用BREAK语句跳出循环的例子

  DECLARE @x int , @s int
  SET @s=0
  SET @x=1
  WHILE  @x<=100
     BEGIN
        SET @s=@s+@x
        IF @s>2000
           BREAK
        SET @x=@x+1
     END
  PRINT 'x='+convert (char(3), @x )
  PRINT 'S='+convert (char(4), @s )
  GO

CONTINUE语句

CONTINUE语句用于重新开始一次WHILE循环

WHILE <逻辑表达式>
    <T-SQL语句序列1>
        CONTINUE
    <T-SQL语句序列2>

例9:使用CONTINUE语句的例子

  DECLARE @x int , @s int
  SET @s=0
  SET @x=1
  WHILE @x<=100
       BEGIN
           SET @s=@s+@x
           SET @x=@x+1
           IF @x<=50
                CONTINUE
           ELSE
                BREAK
       END
  SET @x=@x-1
  PRINT 'x='+convert (char(3) , @x )
  PRINT 'S='+convert (char(4) , @s )
  GO

三、程序返回、屏幕显示等语句

1、RETURN语句

RETURN语句可以在过程、批和语句块中的任何位置使用

语法格式如下:

RETURN  [<整数表达式>]

例10:使用RETURN语句返回整数的例子

use teaching
go
create  procedure  checkstate  @param  char(7)
as
if (select  dept  from  student 
      where  sno =@param) = '电子系'
   RETURN  1
else 
   RETURN  2
go
declare  @return_status  int
exec  @return_status=checkstate @param='0012301'
select  @return_status  as  'Return Status'
go

2、PRINT和RAISERROR语句

(1)PRINT语句

PRINT语句的作用是在屏幕上显示用户消息

PRINT  <字符串>|局部变量|全局变量

(2)RAISERROR语句

RAISERROR语句的作用是将错误信息显示在屏幕上,同时也可以记录在NT日志中

3、WAITFOR语句

WAITFOR语句可以将它之后的语句在一个指定的时间间隔之后执行,或在未来的某一指定时间执行

WAITFOR { DELAY ‘time1’ | TIME ‘time2’}

例11:使用WAITFOR语句的例子

-- 以下代码指示SQL Server等待两秒后查询student表
WAITFOR  DELAY  '00:00:02'
Select  *  from  teaching.dbo.student
GO
/*以下代码指示SQL Server等待到当天上午09:15:10,才执行查询操作*/
Use  teaching
GO
WAITFOR  TIME  '09:15:10'
Select  *  from  student
GO

四、游标概念及使用

1、 游标的概念

游标提供了一种在服务器内部处理结果集的方法,它可以识别一个数据集合内部指定的工作行,从而可以有选择地按行进行操作

无需借助于高级语言来实现,导致不必要的数据传输,从而延长执行的时间

1)声明游标

DECLARE  <游标名>  [ INSENSITIVE ] [ SCROLL ] 
           CURSOR   FOR  <SELECT语句>
           [ FOR  { READ ONLY | UPDATE 
           [ OF <列名1> [ , <列名2>] ] } ]

有关参数的说明:

① < 游标名 >是为声明的游标所取的名字

② 使用insensitive关键字定义的游标会将提取出来的数据放在一个Tempdb的数据库创建的临时表中,如若不选用insensitive关键字,则用户对基本表所做的任何改动都将在游标中得到体现

③ 使用 SCROOL 关键字定义的游标,包括如下6种取数功能

  • FIRST —— 表示取第一行数据
  • LAST —— 表示取最后一行数据
  • PRIOR —— 表示取前一行数据
  • NEXT —— 表示取后一行数据(默认)
  • RELATIVE —— 表示按相对位置取数据
  • ABSOLUTE —— 表示按绝对位置取数据

④ < SELECT 语句 > 主要用来定义游标所要进行处理的结果集,在声明游标的SELECT语句中不允许使用 computecompute byinto关键字

⑤ READ ONLY 表示声明只读游标,不允许通过只读游标进行数据的更新

⑥ UPDATE [ OF <列名1> [ , <列名2>… ] ] 表示定义在这个游标里的可更新列

例12:先定义一个可在student表中所有行上进行操作的游标,再定义一个可对游标处理的结果集进行筛选和排序的只读游标

use  teaching
go
-- 定义可在student表中所有行上进行操作的游标
DECLARE  student_ cursor1  CURSOR
FOR   select * from  student
go
/*定义可对游标处理的结果集进行筛选和排序的只读游标 */
DECLARE student_cursor2  CURSOR
FOR  select  sno , sname  from  student
    where  dept = '计算机系' order by sno
FOR  READ ONLY
go

2)打开游标

在使用游标之前,必须先打开游标

OPEN  <游标名>	

3)关闭游标

不使用游标时应关闭游标,以通知服务器释放游标所占用的资源

CLOSE  <游标名>

4)释放游标

游标结构本身也会占用一定的计算机资源,所以在使用完游标后应该回收被游标占用的资源和空间,彻底将游标释放

DEALLOCATE  <游标名>

例13:说明游标的定义、打开、关闭和释放的过程。

use teaching
go 
DECLARE  student_course_cursor  CURSOR
     FOR  select  *  from  student_course
                where  cno='10106'
SELECT  @@CURSOR_ROWS  
/* 返回值为0,表示游标还没被打开 */
open  student_course_cursor
fetch  next  from  student_course_cursor  
/* 返回满足条件的第一个记录 */
select  @@CURSOR_ROWS  
/* 返回值为-1,表示游标是动态的 */
close  student_course_cursor
deallocate  student_course_cursor
go

2、游标的使用

1)使用游标取数

打开游标后,就可以利用游标提取数据了

FETCH  [ [ NEXT | PRIOR | FIRST | LAST
      | ABSOLUTE { n | @nvar } | RELATIVE 
   { n | @nvar }] FROM ] <游标名>
   [ INTO  <局部变量1> [ , <局部变量2>,]]
-- 在使用INTO子句对局部变量赋值时,局部变量必须和声明游标时使用的select语句中引用到的数据列在数量、顺序和数据类型上保持一致,否则服务器返回提示错误

例14:使用游标取数的操作与循环语句相结合的例子。

use  teaching 
go
-- 定义局部变量
DECLARE @sno  char(7) , @sname  varchar(20)
-- 声明游标
DECLARE  student_cursor1  CURSOR
      FOR  select sno , sname  from  student
      where  spec= '计算机' order  by  sno
-- 打开游标
OPEN  student_cursor1
-- 执行第一次取操作数并对局部变量赋值
FETCH   NEXT   FROM   student_cursor1  
       INTO  @sno , @sname
/* 检查上一次操作的执行状态,若@@FETCH_STATUS为0,则表示成功,可以打印并继续取数,否则停止取数 */
WHILE  @@FETCH_STATUS = 0
   BEGIN
       PRINT '学号:'+@sno+'姓名:'+@sname
       FETCH  NEXT  FROM  student_cursor1 
          INTO  @sno , @sname
   END
-- 关闭游标
CLOSE  student_cursor1
-- 释放游标
DEALLOCATE  student_cursor1
GO

例15:定义一个滚动游标,以实现更灵活的数据提取

Use teaching 
GO
-- 首先执行一遍查询语句以提供滚动游标操作成功与否的对比
select  sno, sname  FROM  student
Where  birthday between '1996-01-01' and '1997-12-31'
Order  by  sno
-- 定义滚动游标
DECLARE  student_cursor2  SCROLL  CURSOR
    FOR  select  sno , sname  FROM  student
    where  birthday 
    between  '1996-01-01'  and  '1997-12-31'
               order   by   sno
-- 打开游标           
OPEN  student_cursor2
-- 提取数据集中的最后一行
FETCH  LAST  FROM  student_cursor2
-- 提起当前游标所在行的上一行
FETCH  PRIOR  FROM  student_cursor2
-- 提取当前数据集中的第5行
FETCH  ABSOLUTE  5  FROM   student_cursor2
-- 提取当前行的前2行
FETCH  RELATIVE -2  FROM   student_cursor2
-- 关闭游标
CLOSE  student_cursor2
-- 释放游标
DEALLOCATE  student_cursor2
GO

2)利用游标修改数据

要使用游标进行数据的修改,其前提条件是该游标必须被声明为可更新的游标。在进行游标声明时,没有带READONLY关键字的游标都是可更新的游标

UPDATE <表名>
SET <列名1>=<表达式l>
	[,<列名2>=<表达式2>,…]
WHERE   CURRENT  OF  <游标名>
-- 其中CURRENT OF <游标名>表示当前游标的当前数据行。CURRENT OF子句只能使用在UPDATE和DELETE操作的语句中

使用游标还可以进行数据的删除,其方法与上雷同,下面仅给出它的语法结构,其语句格式如下

DELETE FROM <表名> WHERE  CURRENT  OF <游标名>

注:在使用游标进行数据的更新或删除之前,用户必须事先获得相应数据库对象的更新或删除的权力,这是进行这类操作的必要前提。

SQL Server:流程控制语言详解,# SQL Server,数据库,sql,sqlserver文章来源地址https://www.toymoban.com/news/detail-753526.html

到了这里,关于SQL Server:流程控制语言详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • eclipse连接SQL Server数据库(详解很细心)

    目录 第一步:启动SQl Server服务 第二步:进入数据库建库建表 第三步:进入 eclipse 编写连接数据库的代码     编写连接库的完整代码  里面的main方法是测试是否成功连接数据库 以下效果如果你的控制台输出的一样就代码数据库已连接成功

    2024年02月11日
    浏览(44)
  • 数据库SQL Server实验报告 之 SQL语言进行简单查询(3/8)

    实验名称          SQL语言进行简单查询 注意:原版word在下载资源里面(免费下载) 实验目的及要求: 掌握各种查询的SQL脚本写法,包括SELECT、FROM、WHERE、GROUP BY、HAVING子句的用法,特别要求比较内连接、外连接的结果 在XSGL数据库中,使用各种查询条件完成指定的查询

    2024年02月02日
    浏览(63)
  • SQL SERVER从一台服务器复制数据库至另一台数据库详解--方法1

    一、 数据库的备份 1 选择想要复制的数据库   2右键点击数据库,选择任务、备份   3 生成备份文件   4 退出到主界面,右键新建数据库  5 在新建的数据库中右键选择还原,点击设备后面的三个点,在弹窗中把刚才备份的数据库文件选中。  6 点击确定以后,数据库还原完毕

    2024年02月06日
    浏览(76)
  • Mysql-------SQL:DDL数据定义语言、DDM数据操作语言、DQL数据库查询语言、DQL数据控制语言

    SQL语言可以分为: DDL(Data Definition Language)语言:数据定义语言,用于 创建或更改数据库中的表、视图、索引等对象 DML(Data Manipulation Language)语言:数据操作语言,用来对 数据库表中的数据进行增删改查操作; DQL(Data Query Language)语言: 数据查询语言,用来查询数据库

    2024年02月13日
    浏览(75)
  • 【SQL Server】数据库开发指南(七)MS-SQL存储过程全面解析:种类、优点和创建方法详解

    本系列博文还在更新中,收录在专栏:#MS-SQL Server 专栏中。 本系列文章列表如下: 【SQL Server】 Linux 运维下对 SQL Server 进行安装、升级、回滚、卸载操作 【SQL Server】数据库开发指南(一)数据库设计的核心概念和基本步骤 【SQL Server】数据库开发指南(二)MSSQL数据库开发对

    2024年02月07日
    浏览(105)
  • Microsoft SQL Server 2019 下载、安装及Java JDBC配置连接数据库(多图详解 超详细)

    一、下载 下载链接Microsoft SQL Server 二、安装 1.找到刚刚下载的文件,双击打开后,选择基本并接受 2.选择接受 3.选择安装位置,并点击安装,然后等待下载安装完成 4.正在安装 -5.遇到了一个问题,重启一下(未遇到该问题的可忽略此步) 6.安装成功,点击安装SSMS 7.点击下载

    2024年02月04日
    浏览(108)
  • SQL Server 数据库之SQL Server 数据库的安全设置

    数据库服务器是所有应用的数据中转站,若数据库服务被恶意攻击,可能会造成数据泄露、数据丢失、数据被恶意篡改等诸多无法挽回的损失; 所以,对数据库进行安全设置是每一个数据库管理人员都应掌握的知识; SQL Server 登录模式分为 “Windows 身份验证模式” 和 “SQL

    2024年02月06日
    浏览(80)
  • SQL Server数据库使用SQL Server代理实现数据库自动备份

    在现实中,为了保证数据的安全和完整,防止人为错误和硬件故障等造成的数据丢失和损坏,就需要用到数据库的备份,不同的数据库方法有所差别,我这边主讲SQL Server数据库的备份和使用SQL Server代理作业实现数据库的定时备份。 目录 一、开启SQL Server代理 1、找到SQL Serv

    2024年02月09日
    浏览(83)
  • 什么是T-SQL编程?T-SQL是Transact-SQL的缩写,是一种扩展了SQL(结构化查询语言)的编程语言,用于Microsoft SQL Server数据库管理系统中的数据管理和操作。T-

    什么是T-SQL编程? T-SQL是Transact-SQL的缩写,是一种 扩展了SQL(结构化查询语言) 的编程语言,用于Microsoft SQL Server数据库管理系统中的数据管理和操作。T-SQL支持创建 存储过程、触发器、函数 等高级特性,能够更加灵活地进行数据操作和处理。基本的T-SQL语法与标准SQL很相

    2024年01月21日
    浏览(97)
  • SQL Server数据库——创建数据库

    目录 一、界面方式创建数据库 1.1创建数据库xscj,数据文件和日志文件的属性按默认值设置  1.2在xscj数据库中增加文件xcsj1,其属性均取系统默认值  1.3在数据库xscj中增加一个名为myGroup的文件组。 1.4数据库的重命名  1.5数据库的删除  二、命令方式创建数据库 以创建学生管

    2024年02月01日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包