T-SQL查询进阶--流程控制语句

标签: sql 流程控制 语句 | 发表时间:2011-08-23 13:06 | 作者:CareySon Bloger
出处:http://www.cnblogs.com/

概述

     和其他高级语言一样,T-SQL中也有用于控制流程的语句。T-SQL中的流程控制语句进一步扩展了T-SQL的力量……使得大部分业务逻辑可以在数据库层面进行。但很多人对T-SQL中的流程控制语句并没有系统的了解,本篇文章会系统的对T-SQL语句中的流程控制语句进行系统讲解。

 

基本概念

     在没有流程控制语句的情况下,T-SQL语句是按照从上到下的顺序逐个执行:

     1

    

     使用流程控制语句可以让开发人员可以基于某些逻辑进行选择性的跳转,实现了类似高级语言的跳转结构:

     2 

 

流程控制语句的使用范围和GO关键字

     流程控制语句只能在单个批处理段(Batch),用户自定义函数和存储过程中使用。不能跨多个批处理段或者用户自定义函数和存储过程。

     因为这里重点讲到T-SQL查询语句,所以这里只讲批处理段(Batch).

     一个批处理段是由一个或者多个语句组成的一个批处理,之所以叫批处理是因为所有语句一次性被提交到一个SQL实例。在这个批处理范围内,局部变量是互相可见的。

     而想让多个语句分多次提交到SQL实例,则需要使用GO关键字。GO关键字本身并不是一个SQL语句,GO关键字可以看作是一个批处理结束的标识符,当遇到GO关键字时,当前GO之前的语句会作为一个批处理直接传到SQL实例执行。所以不在同一个批处理内局部变量不可见,也不可对跨批处理的语句使用流程控制语句.

     在同一个批处理中局部变量互相可见:

     3-1

 

    在不同批处理中局部变量不可见:

    3-2

 

    在不同批处理中,流程控制语句不能跨批处理:

    3-3

    

T-SQL中的8个流程控制语句关键字

    在T-SQL中,与流程控制语句相关的关键字有8个:

 

BEGIN...END

BREAK

GOTO

CONTINUE

IF...ELSE

WHILE

RETURN

WAITFOR

   下面对上述关键字进行挨个讲解

 

 

BEGIN…END关键字

    BEGIN…END关键字也是流程控制语句需要用到的最基本关键字,用于将多个语句划分成逻辑上的一部分。其实可以直接理解成类C语言中的花括号(“{}"“)

    4

 

WHILE/BREAK/CONTINUE关键字

   在T-SQL的流程控制语句中,循环语句只有WHILE循环,并没有传统高级语言的FOR和SWITCH循环。WHILE除了被用于流程控制语句的循环之外,还经常被用于游标之中。

   WHILE关键字和高级语言中的WHILE关键字几乎完全一样。WHILE循环中可以利用BREAK和CONTINUE关键字对循环进行控制。

   CONTINUE关键字用于结束本次循环,直接开始下一次循环。

   BREAK关键字用于直接跳出WHILE循环语句。

   这里值得注意的是,当WHILE循环嵌套时,CONTINUE关键字和BREAK关键字只会作用于它们所处的WHILE循环之内,不会对外部WHILE循环产生作用。

   一个简单的例子如下:从1循环到10,当循环到7时,结束本次循环并继续,当循环到8时,跳出循环

    5

IF..ELSE关键字

    IF..ELSE关键字实现了非此既彼的逻辑。和高级语言中的IF..ELSE具有完全一样的使用方法,这里就不再讲述了,例子参看上图。

    还有要注意的是IF经常会和EXISTS关键字相结合来查看数据表中指定的数据是否存在,比如:

    我想查询员工中没有上级的人,如果有这个人,则输出“XXX is our boss”,如果没有,则输出"There is no infomation about our boss”

    6

 

GOTO关键字

    GOTO关键字因为能打乱程序的整个流程而在高级语言中臭名卓著。GOTO关键字的使用非常简单,定义一个跳转标签,只要GOTO 标签名就可以。如果说一定要使用GOTO关键字的话,最佳实践是只使用在错误处理上,比如:

    7

 

RETURN关键字

    Return是最简单有效直接无条件告诉服务器跳出某个批处理段(Batch),用户自定义函数和存储过程的方式。在同一个批处理中Return关键字直接截止当前Return所在的批处理(Batch),批处理有关概念请参考前面GO关键字那一节.

    简单的Return概念如下例子:

    10

     在存储过程中,Return语句后面可以返回数字用于返回执行状态或者错误代码。

     很多人会把Return语句和RAISERROR函数搞混,区别在于RAISERROR函数会引发错误,并且程序依然会往下执行:

     11

WAITFOR关键字

    WAITFOR关键字允许指定语句在特定时间或是推迟特定时间执行。

    推迟等待和在特定时间执行的语法分别是WAITFOR DELAY ‘需要等待的执行时间',WAITFOR TIME ‘需要执行程序的精确时间’

    简单的语法例子如下:

    8

   WAITFOR的功能可以实现更为复杂的业务逻辑,比如:

   我想开始一项促销活动,在当前时间10小时后开始,为8折,20小时后结束,变为9折:

   9

 

总结

   本篇文章从T-SQL查询的角度讲解了流程控制语句的8个关键字。利用好这些关键字是掌握复杂T-SQL查询的必要条件。

作者: CareySon 发表于 2011-08-23 13:06 原文链接

评论: 6 查看评论 发表评论


最新新闻:
· Native Client让你使用C/C++开发Web应用(2011-08-23 22:07)
· 美博客称谷歌只对用户不作恶 沉重施压对手(2011-08-23 22:05)
· 让你的旧电脑重获新生的5个Linux发行版(2011-08-23 22:03)
· 可以提高你网站各方面的25个高质量图标集(2011-08-23 22:01)
· 43个多图片轮换播放jQuery教程和插件(2011-08-23 22:00)

编辑推荐:我心目中的Asp.net核心对象

网站导航:博客园首页  我的园子  新闻  闪存  小组  博问  知识库

相关 [sql 流程控制 语句] 推荐:

T-SQL查询进阶--流程控制语句

- Bloger - 博客园-首页原创精华区
     和其他高级语言一样,T-SQL中也有用于控制流程的语句. T-SQL中的流程控制语句进一步扩展了T-SQL的力量……使得大部分业务逻辑可以在数据库层面进行. 但很多人对T-SQL中的流程控制语句并没有系统的了解,本篇文章会系统的对T-SQL语句中的流程控制语句进行系统讲解.      在没有流程控制语句的情况下,T-SQL语句是按照从上到下的顺序逐个执行:.

PL/SQL流程控制(原创)

- - ITeye博客
类似于高级语言,流程控制语句是PL/SQL语言的重要组成部分. 这些流程控制语句使得PL/SQL加大了代码的灵活性和多样性,大大简化了程序的编写. 下面将列出流程控制语句并给出具体事例. 判断condition是否成立,成立就执行IF 与END IF 之间的语句. 例:输入员工编号,查询其工资,如果他们的职位是CLERK,则工资增加%,再显示修改前后的工资数.

sql语句总结

- zhaoloving - 博客园-首页原创精华区
1、创建数据库语句(以部门表(department)和员工表(employee)位例). --员工表 employee.   alter table [表名] add .     constraint [键名] Primary key [主键名称].   alter table [表名] add.      constraint [键名] unique(唯一键名称).

SQL语句大全

- - SQL - 编程语言 - ITeye博客
原文地址:http://www.cnblogs.com/yubinfeng/archive/2010/11/02/1867386.html. 3、说明:备份sql server. --- 创建 备份数据的 device. A:create table tab_new like tab_old (使用旧表创建新表).

sql经典语句

- - 数据库 - ITeye博客
3、说明:备份sql server. --- 创建 备份数据的 device. table tab_new like tab_old (使用旧表创建新表). DB2中列加上后数据类型也不能改变,唯一能改变的是增加. 注:索引是不可更改的,想更改必须删除重新建. 10、说明:几个简单的基本的sql语句.

sql语句优化

- - 数据库 - ITeye博客
性能不理想的系统中除了一部分是因为应用程序的负载确实超过了服务器的实际处理能力外,更多的是因为系统存在大量的SQL语句需要优化. 为了获得稳定的执行性能,SQL语句越简单越好. 对复杂的SQL语句,要设法对之进行简化. 1)不要有超过5个以上的表连接(JOIN). 2)考虑使用临时表或表变量存放中间结果.

Java中如何解析SQL语句、格式化SQL语句、生成SQL语句?

- - 程序猿DD
昨天在群里看到有小伙伴问,Java里如何解析SQL语句然后格式化SQL,是否有现成​类库可以使用. 之前TJ没有做过这类需求,所以去研究了一下,并找到了一个不过的解决方案,今天推荐给大家,如果您正要做类似内容,那就拿来试试,如果暂时没需求,就先了解收藏(技多不压身). JSqlParser是一个用Java编写的SQL解析器,可以将SQL语句解析为Java对象,从而使开发人员能够轻松地分析、修改和重构SQL查询.

SQL查询语句(oralce)(1)

- - ITeye博客
  主要用于创建删除数据库对象和维护数据对象的属性. 主要有三个主命令:CREATE .DROP. SQL>CREATE TABLE 表1 AS SELECT * FROM 表2;. SQL>DROP TABLE 表名;. SQL>--添加.修改.删除字段. SQL> ALTER TABLE 表名 ADD/MODIFY(字段 类型);.

(转)经典sql查询语句大全

- - SQL - 编程语言 - ITeye博客
3、说明:备份sql server. --- 创建 备份数据的 device. A:create table tab_new like tab_old (使用旧表创建新表). DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度. 7、说明:添加主键: Alter table tabname add primary key(col).

P6SPY 2.0 发布,SQL 语句拦截

- - 开源中国社区最新新闻
8年过去了,P6SPY 发布了全新稳定版本 2.0 ,P6Spy是一个可以用来在应用程序中拦截和修改数据操作语句的开源框架. 通过P6Spy我们可以对SQL语句进行拦截,相当于一个SQL语句的记录器,这样我们可以用它来作相关的分析,比如性能分析. 下载地址: https://github.com/p6spy/p6spy/wiki/Download.