控制流语句也称为流程控制语句,是和高级编程语言中的类似功能一致的,引入控制流语句将使T-SQL代码有顺序执行转变为按控制执行。

  批处理:一个批处理段是由一个或者多个语句组成的一个批处理,之所以叫批处理是因为所有语句一次性被提交到一个SQL实例。

  [1] 批处理是分批提交到SQL Server示例,因此在不同的批处理里局部变量不可访问。

  [2] 在不同批处理中,流程控制语句不能跨批处理。

  [3] 如果想让多个语句分多次提交到SQL实例,则需要使用GO关键字。GO关键字本身并不是一个SQL语句,GO关键字可以看作是一个批处理结束的标识符,当遇到GO关键字时,当前GO之前的语句会作为一个批处理直接传到SQL实例执行。  

  不同的批处理局部变量不可访问,例如:

DECLARE @i int;
SET @i = 1;
GO --分批了
PRINT @i --@i在这个批里未定义

  输出:

消息 137,级别 15,状态 2,第 1 行
必须声明标量变量 "@i"。

  流程控制语句不能跨批处理,例如:

DECLARE @i int;
SET @i = 1;
IF(@i = 1)
PRINT('');
 GO --分批了
ELSE
PRINT('不知道');  --ELSE找不到IF了,控制流语句不跨批,因此报错。

  结果如下:

1
消息 156,级别 15,状态 1,第 1 行
关键字 'ELSE' 附近有语法错误。

  1、程序块语句BEGIN...END

  程序块语句用于将多条T-SQL语句封装起来构成一个程序块。SQLServer在处理时,将整个程序块视为一条T-SQL语句执行。

BEGIN
  <T-SQL命令行或程序块>
END

  常与与WHILE 或 IF...ELSE 组合起来使用,可以相互嵌套。

  2、判断语句 IF...ELSE

  IF...ELSE 语句用于条件判断,系统将根据条件满足与否来决定如何执行语句,ELSE 子句是可选的。语法:

IF 逻辑表达式    
语句块1
ELSE
语句块2
语句块3

  IF 的形式通常包括 if exists(用于判断是否存在)和 if not(是否条件不满足)

  3、循环语句 WHILE

  WHILE 语句用于执行循环,可以根据循环条件重复执行语句块。通常使用 BREAK 和 CONTINUE 关键字在循环内部进行控制。语法:

WHILE <条件表达式>
BEGIN
<sql语句块1>
[break]
<sql语句块2>
[continue]
<sql语句块3>
END

  BREAK:程序跳出循环体,结束while的循环。

  CONTINUE:程序跳出当前一轮循环,进入下一轮循环。

  4、分支判断语句CASE

  CASE语句用于执行多条件的分支判断。语法如下:

CASE input_expression
WHEN when_expression
THEN result_expression
[...n]
[
ELSE else_result_expression
]
END

  5、无条件退出语句RETURN

  RETURN 语句用于使程序从一个查询、存储过程或批量处理中无条件返回,其后面的语句不再执行。如果在存储过程中使用return语句,那么此语句可以指定返回给调用应用程序、批处理或过程的整数;如果没有为return指定整数值,那么该存储过程将返回0。

  存储过程返回值:

返回值 含义
0 存储过程执行成功
-1 没有找到数据库对象
-2 数据类型错误
-3 进程死锁错误
-4 进程死锁错误
-5 语法错误
-6 其他用户错误
-7 资源错误
-8 非致命的内部错误
-9 达到系统配置参数极限
-10 内部一致性致命错误
-11 内部一致性致命错误
-12 表或索引崩溃
-13 数据库崩溃
-14 硬件错误

  语法:

return [整数表达式]

  实例如下:

BEGIN
PRINT(1);
PRINT(2);
RETURN;
PRINT(3); --在RETURN之后的代码不会被执行,因为会跳过当前批处理
END
GO
BEGIN
PRINT(4);
END

  输出如下:1 2 4

  6、无条件跳转语句 GOTO

  GOTO语句可以使程序无条件跳转到指定的程序执行点,增加了程序设计的灵活性。但破坏了程序的结构化,使程序结构变得复杂而且难以测试。

  语法:

GOTO 语句标识符

  使用说明:

  [1] 语句标识符可以是数字或者字母的组合,但必须以":"结束。而在GOTO语句后的标识符不必带":"。

  注意:

  GOTO语句和跳转标签可以在存储过程、批处理或语句块中的任何地方使用,但不能超出批处理的范围。

  示例:

DECLARE @i int;

SET @i = 1;
SET @i = 2;
SET @i = 3;
SET @i = 4;
GOTO ME;
SET @i = 5;  --这行被跳过了
SET @i = 6;  --这行被跳过了
SET @i = 7;  --这行被跳过了 ME:PRINT('跳到我了?');
PRINT @i

  结果如下:跳到我了? 4

  7、延期执行语句 WAITFOR  

  WAITFOR 语句用于挂起语句的执行,直到指定的时间点或者指定的时间间隔。waitfor语句常用语某个特定的时间点或时间间隔自动执行某些任务。在waitfor语句中不能包含打开游标,定义视图这样的操作。在包含事务的语句中不要使用waitfor语句,因为waitfor语句在时间点或时间间隔执行期间将一直拥有对象的锁,当事务中包含waitfor语句,事务的其他语句又需要访问被锁住的数据对象事就容易发生死锁现象。

  [1] 指定时间点的语法

WAITFOR
{
Time 'time'
}

  示例:对着时间来看真是分毫不差。

WAITFOR TIME '15:49:22'
BEGIN
PRINT '定时输出'
END

  [2] 指定等待时间间隔的语法

WAITFOR
{
DELAY 'interval'
}

  interval为时间间隔,指定执行waitfor语句之前需要等待的时间,最多为24小时。

  示例:

WAITFOR DELAY '00:00:03'
BEGIN
PRINT '延迟3秒输出!';
END

T-SQL 之 控制流语句的更多相关文章

  1. sql 中常见的控制流语句

    控制流语句:1 begin .....end  2 if ...else  例如:if exists (select * from 表名称 ) begin selct * from  表名称 end  ...

  2. T-SQL 控制流语句

    批处理: 一个批处理段是由一个或者多个语句组成的一个批处理,之所以叫批处理是因为所有语句一次性被提交到一个SQL实例. 批处理是分批提交到SQL Server示例,因此在不同的批处理里局部变量不可访问 ...

  3. SQL高性能查询优化语句(总结)

    SQL 高性能查询优化语句,一些经验总结 1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where ...

  4. linux 几个控制流语句的格式例子(if语句)

    linux 几个控制流语句的格式例子:if 语句例子:#!/bin/sh a=10b=20 if [ $a == $b ]then echo "a is equal to b"el ...

  5. java基础-控制流语句

    浏览以下内容前,请点击并阅读 声明 一般情况下,代码的执行按照从上到下的顺序,然而通过加入一些判断,循环和跳转语句,你可以有条件地执行特定的语句. 接下来分三部分介绍Java的控制流语句,他们是判断语 ...

  6. 如何判断一条sql(update,delete)语句是否执行成功

    如何判断一条sql(update,delete)语句是否执行成功 catch  (SQLException    e)  {  }  catch不到错误应该就成功了.   ============== ...

  7. (Python )控制流语句if、for、while

    这一节,我们将学习Python的控制流语句,主要包括if.for.while.break.continue 和pass语句 1. If语句 if语句也许是我们最熟悉的语句.其使用方法如下: x=inp ...

  8. SQL数据库基本语句

    SQL特点--> 1)综合统一.SQL是集数据定义.数据操作和数据控制于一体,语言峰峰统一,可独立完成数据库生命周期的所有活动. 2)高度非过程化.SQL语言是高度非过程化语言,当进行数据操作时 ...

  9. 【Python】控制流语句、函数、模块、数据结构

    1.三种控制流语句:if\for\while 2.每句后都要加冒号 3.有elif语句=else后加一个if 注意使用变量名! 注意缩进! 注意控制流语句后面要加冒号! 4.for i in rang ...

随机推荐

  1. Unity 2D游戏开发教程之精灵的死亡和重生

    Unity 2D游戏开发教程之精灵的死亡和重生 精灵的死亡和重生 目前为止,游戏项目里的精灵只有Idle和Walking这两种状态.也就是说,无论精灵在游戏里做什么,它都不会进入其它的状态,如死亡.于 ...

  2. Selenium模拟登陆简书

    from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.c ...

  3. [APIO2010]特别行动队 --- 斜率优化DP

    [APIO2010]特别行动队 题面很直白,就不放了. 太套路了,做起来没点感觉了. \(dp(i)=dp(j)+a*(s(i)-s(j))^{2}+b*(s(i)-s(j))+c\) 直接推出一个斜 ...

  4. POJ2157 Check the difficulty of problems 概率DP

    http://poj.org/problem?id=2151   题意 :t个队伍m道题,i队写对j题的概率为pij.冠军是解题数超过n的解题数最多的队伍之一,求满足有冠军且其他队伍解题数都大于等于1 ...

  5. 【最小割】BZOJ2039- [2009国家集训队]employ人员雇佣

    [题目大意] 给定n个人,每个人有一个佣金,i和j如果同时被雇佣会产生2*E(i,j)的效益,i和j如果一个被雇佣一个不被雇佣会产生E(i,j)的亏损,求最大收益. [思路] 如果没有亏损,其实非常类 ...

  6. 3524: [Poi2014]Couriers -- 主席树

    3524: [Poi2014]Couriers Time Limit: 20 Sec  Memory Limit: 256 MB Description 给一个长度为n的序列a.1≤a[i]≤n.m组 ...

  7. Codeforces Beta Round #5 D. Follow Traffic Rules 物理

    D. Follow Traffic Rules 题目连接: http://www.codeforces.com/contest/5/problem/D Description Everybody kn ...

  8. keras入门--Mnist手写体识别

    介绍如何使用keras搭建一个多层感知机实现手写体识别及搭建一个神经网络最小的必备知识 import keras # 导入keras dir(keras) # 查看keras常用的模块 ['Input ...

  9. css中!important的优先级问题

    css中!important的优先级在主页面中写>在外部引用的css文件 之前我一直以为css的样式不管写在哪里只要加上!important那么它的优先级就是最高的,事实上并不是这样的,尤其在动 ...

  10. “花生壳” + “VisualSVN” 巧妙实现远程代码版本号控制

    近期因为项目须要,要远程訪问svnserver,可是没有固定域名和ip,因此就打算用花生壳申请一个免费的域名构建一个server,再把VisualSVN部署在server上,就能够在外网訪问了(假设你 ...