T-SQL 流程控制

流程控制元素用于控制代码的流程。T-SQL提供了几种非常基本的流程控制元素,其中包括IF... ELSE元素和WHILE。

 

一.IF ... ELSE 

IF ... ELSE元素用于根据条件来控制代码的执行流程。如果条件取值为TRUE, 则执行指定的语句或语句块;如果条件取值为FALSE或UNKNOWN, 则执行指定的另一语句或语句块(此部分为可选的)。例如,以下代码检查今天是否是一年的最后一天(今天的年份和明天的年份不同)。如果是,代码就打印输出消息, 说今天是一年的最后一天;如果不是, 代码就打印输出消 息, 说今天不是一年的最后一天:

IF YEAR(CURRENT_TIMESTAMP) <> YEAR(DATEADD(DAY,1,CURRENT_TIMESTAMP))
    PRINT 'Today is the last day of the year'
ELSE
    PRINT 'Today is not the last day of the year'

如果需要控制的流程分支超过两个,则可以使用嵌套的IF ... ELSE元素。例如,以下代码对3种情况进行不同的处理:

IF YEAR(CURRENT_TIMESTAMP) <> YEAR(DATEADD(DAY,1,CURRENT_TIMESTAMP))
    PRINT 'Today is the last day of the year'
ELSE
    IF MONTH(CURRENT_TIMESTAMP) <> MONTH(DATEADD(DAY,1,CURRENT_TIMESTAMP))
        PRINT 'Tooday is the last day of the month but not the last day of the year.'
    ELSE
        PRINT 'Tooday is not the last day of the month.'        

如果需要在IF或ELSE部分运行多条语句, 则可以使用语句块。语句块的边界是用一对BEGIN和END 关键字标识的 。例 如, 如果今天是 一个月的第1天, 则对数据库进行完整备份;如果今天是一个月的最后一天, 则对数据库进行差异备份(只保存上一次完整备份以来做过的更新),以下代码可以实现这样的备份策略:

IF DAY(CURRENT_TIMESTAMP) =1
    BEGIN
        PRINT 'Today is the first day of the month.';
        PRINT 'Starting a full database backup.';
        BACKUP DATABASE DemoDB TO DISK = 'path.bak' WITH INIT;
        PRINT 'Finished full database backup';
    END    
ELSE    
    BEGIN
        PRINT 'Today is not the first day of the month.';
        PRINT 'Starting a differential database backup.';
        BACKUP DATABASE DemoDB TO DISK = 'path.bak' WITH DIFFERENTIAL;
        PRINT 'Finished differential database backup';
    END    

 

二.WHILE

T-SQL提供的WHILE流程控制元素可以用于循环执行代码。当在WHILE关键字后指定的条件取值为TRUE时,WHILE元素可以重复执行一条语句或语句块。当指定的条件取值为FALSE或UNKNOWN时,循环将会终止。T-SQL没有提供执行预定循环次数的内建元素,不过,用WHILE循环和一个变量可以容易地模拟这样的元素。例如,以下代码演示了如何编写一个执行10次的循环:

DECLARE @i AS INT; 
SET @i=1 
WHILE @i <= 10 
BEGIN 
    PRINT @i;
    SET @i=@i+1;
END;

如果想在循环体内部的某一处退出当前循环, 继续执行循环体之后的语句, 则可以使用BREAK命令。 例如, 以下代码当变量@j 的值等于6时,就会退出循环:

DECLARE @i AS INT; 
SET @i=1 
WHILE @i <= 10 
BEGIN 
    IF @i = 6 BREAK;
    PRINT @i;
    SET @i=@i+1;
END;

如果想在循环体内的某处忽略当前循环的剩余处理,继续进行下一次循环, 则可以使用CONTINUE命令。例如,以下代码演示了如何在第6次进入循环体时,忽略从IF语句之后直到循环体结束之前出现的其他操作:

DECLARE @i AS INT; 
SET @i=1 
WHILE @i <= 10 
BEGIN 
    SET @i=@i+1;
    IF @i = 6  CONTINUE;
    PRINT @i;
END;

 

 

好了,本篇文章就介绍到这儿,欢迎大家留言交流;喜欢或有帮助到您的话,点个赞或推荐支持一下!

转载于:https://www.cnblogs.com/johnvwan/p/9497855.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值