Fork me on GitHub

流程控制语句

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

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

BEGIN...END   BREAK
 GOTO  CONTINUE
 IF...ELSE WHILE
 RETURN  WAITFOR
 CASLE  RAISEERROR和PRINT

            

BEGIN…END关键字

  BEGIN…END也是流程控制语句需要用到的最基本关键字,用于将多个语句划分成逻辑上的一部分。其实可以直接理解成Delphi的begin...end  或者C类语言的{},用于按块(block)顺次执行多条语句。

IF..ELSE关键字

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

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

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

    6

WHILE/BREAK/CONTINUE关键字

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

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

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

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

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

 语法:

  WHILE:    

  WHILE Boolean_expression

         sql_statements

例:一下WHILE循环体被执行了三次。

DECLARE @x int

      SET @x=0

    WHILE @x<3

BEGIN

   @x=@X+1

PRINT 'x='+CONVERT(char(1),@x)

END
 
BREAK   用于跳出最内存的WHILE循环
DECLARE @x int
    SET @x=0
    WHILE @x<3
BEGIN
   @x=@X+1
   PRINT 'x='+CONVERT(char(1),@x)
   BREAK                      /*此时跳出WHILE循环体只打印出x=1*/
END
CONTINUE   用于重新开始一次WHILE循环,在CONTINUE语句后面的语句都不在执行
DECLARE @x int
    SET @x=0
    WHILE @x<3
BEGIN
   @x=@X+1
   PRINT 'x='+CONVERT(char(1),@x)
   IF(@X=2)CONTINUE  
/*如果@x!=2则会打印一下语句,否则不会执行下一条命令*/
   PRINT 'X IS NOT 2'                 
END

WAITFOR关键字

 

    WAITFOR关键字允许指定语句在特定时间或是推迟特定时间执行,也就是将它之后的语句在一个指定的间隔之后执行,或未来的某个指定时间执行。

    语法: WAITFOR {DELAY 'time'|TIME 'time'}

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

    可以简单的理解为:DELAY  时间段    TIME时间点

    简单的语法例子如下:

    8

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

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

DECLARE @StartTime DATATIME
DECLARE @EndTime DATATIME
SET @StartTime=CAST(GETDATA()+'10:00:00'AS DATATIME)/*定义开始时间*/
SET @EndTime=CAST(GETDATA()+'20:00:00'AS DATATIME)   /*定义结束时间*/
WAITFOR TIME @StartTime
BEGIN
  UPDATE Goods SET price=price*0.8 /*8折*/
END
WAITFOR TIME @EndtTime
BEGIN
  UPDATE Goods SET price=price*0.9/*9折*/
END

GOTO关键字

 GOTO关键字的使用非常简单,定义一个跳转标签,只要GOTO 标签名就可以。如果说一定要使用GOTO关键字的话,最佳实践是只使用在错误处理上。

GOTO的标号语法:label:

    7

RETURN关键字

    Return是最简单有效直接无条件告诉服务器跳出某个批处理段(Batch),用户自定义函数和存储过程的方式。在同一个批处理中Return关键字直接截止当前Return所在的批处理(Batch),和BREAK很相似,但是有一点不同,RETURN可以返回一个整数,语法如下:RETURN [integer_expression],在学到存储过程的时候会提到。

    简单的Return概念如下例子:

    10

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

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

     11

CASE

   CASE表达式可以根据多个选择确定执行内容。CASE表达式有两种形式:

简单表达式:

CASE input_expression

WHEN when_expression THEN result_expression[...n]

[ELSE else_result_expression]

END

选择表达式:

CASE

 WHEN Boolean_expression THEN result_expression[...n]

[ELSE else_result_expression]

END

例:1.简单表达式运用

USE Market
GO
SELECT Name AS GoodsName,
GoodsStatus=
CASE Status
WHEN 1 THEN '正在包装,尚不能出售'
WHEN 0 THEN '可以出售'
ELSE '未知状态'
END
FROM Goods
 
 

2.选择表达式运用

USE Market
SELECT Name AS GoodsName,
StorageStatus=
CASE
WHEN Storage=0 THEN '没有库存'
WHEN Storage<300 THEN '库存较少'
WHEN Storage>=300 AND Storage<1000 THEN '库存正常'
ELSE '库存过量'
END
FROM Goods

 PRINT
PRINT关键字的作用是屏幕上显示用户消息
语法:

例如:打印一个局部变量@MyMsg
DECLARE @MyMsg char(20)
SET @MyMsg='This is my message.'
PRINT @
MyMsg 

RAISERROR
RAISERROR关键字是一个比PRINT关键字功能更强大的返回信息语句。它的作用是将错误信息显示在屏幕上,同时也可以记录在NT日志中。RAISERROR可以返回以下两种类型消息:
1.保存在sysmessages系统表中的用户自定义消息,在RAISERROR语句中用错误号表示。自定义错误消息是用sp_addmessage系统存储过程加到sysmessages系统表中。
2.RAISERROR语句返回以字符串形式给出的错误信息。
语法:
RAISERROR({msg_id|msg_str}{,severity,state}[WITH option])

msg_id:sysmessages系统表中用户自定义错误消息的错误号,任何用户自定义错误号都应大于50000.
msg_str:msg_str可以是像C语言种的 printf语句一样格式化字符串。这种在RAISERROR语句中直接给出错误信息的错误号为50000
severity:代表错误严重等级,用大于0的整数表示。0-18的错误可以被任何用户引发,19-25只能由系统管理员引发
         25以上的错误在使用RAISERROR引发时必须同时使用WITH LOG
state:代表发生错误时的状态消息,可以是1-127之间的任意整数
WITH option:给出RAISERROR的三个选项
        ◆LOG  :是将错误记录到SQL Sever错误日志和WINDOWS NT应用日志中
        ◆NOWAIT:立即发送消息
        ◆SETERROR:无论错误等级多少,都将@@ERROR全局变量置为用户自定义错误消息的错误号或50000.
 例1:在屏幕上显示一条信息,信息中给出当前使用的数据库的标示号和名称,信息是在语句中直接给出的,使用格式化字符串。
DECLARE @dbid int  /*声明一个数据库标示号变量*/
SET @dbid =DB_ID()
DECLARE @dbname nvarchar(128)
SET @dbname=DB_NAME()
RAISERROR
('The current database ID is:%d,the database name is:%s.',16,1,@dbid,@dbname)

返回:
服务器: 消息 50000,级别 16,状态 1,行 5
The current database ID is:7,the database name is:Market.

 例2:将上例种的错误信息保存到sysmessages系统表中,然后再RAISERROR 语句中用错误号调用.

sp_messages 50005,16,'The current database ID is:%d,the database name is:%s.'
GO
DECLARE @dbid int
SET @dbid =DB_ID()
DECLARE @dbname nvarchar(128)
SET @dbname=DB_NAME()
RAISERROR
(5005,16,1,@dbid,@dbname)

返回:
服务器: 消息 50005,级别 16,状态 1,行 5
The current database ID is:7,the database name is:Market.

 


 
posted @ 2012-03-07 22:41  Halower  阅读(1546)  评论(0编辑  收藏  举报