SQLServer学习笔记(7)控制流

BEGIN...END

用于定义一组一起执行的 Transact-SQL 语句,多见于IF...ELSE条件控制和WHILE循环控制


BREAK

退出 WHILE 循环内部的 WHILE 语句或 IF ELSE 语句最里面的循环

示例:

-- Uses AdventureWorks  

WHILE ((SELECT AVG(ListPrice) FROM dbo.DimProduct) < $300)  
BEGIN  
    UPDATE DimProduct  
        SET ListPrice = ListPrice * 2;  
     IF ((SELECT MAX(ListPrice) FROM dbo.DimProduct) > $500)  
         BREAK;  
END

CONTINUE

重新开始 WHILE 循环


GOTO

将执行流更改到标签处。 跳过 GOTO 后面的 Transact-SQL 语句,并从标签位置继续处理。 GOTO 语句和标签可在过程、批处理或语句块中的任何位置使用

* GOTO语句可以潜嵌套

* GOTO 分支可跳转到定义在 GOTO 之前或之后的标签

* GOTO 语句的权限默认情况下授予任何有效用户

语法:

Define the label:   
label:   
Alter the execution:  
GOTO label

示例:

DECLARE @Counter int;  
SET @Counter = 1;  
WHILE @Counter < 10  
BEGIN   
    SELECT @Counter  
    SET @Counter = @Counter + 1  
    IF @Counter = 4 GOTO Branch_One --Jumps to the first branch.  
    IF @Counter = 5 GOTO Branch_Two  --This will never execute.  
END  
Branch_One:  
    SELECT 'Jumping To Branch One.'  
    GOTO Branch_Three; --This will prevent Branch_Two from executing.  
Branch_Two:  
    SELECT 'Jumping To Branch Two.'  
Branch_Three:  
    SELECT 'Jumping To Branch Three.';  

IF...ELSE

控制流IF...ELSE用于指定Transact-SQL 语句的执行条件

语法

IF Boolean_expression   
     { sql_statement | statement_block }   
[ ELSE   
     { sql_statement | statement_block } ] 

参数:

Boolean_expression
返回 TRUE 或 FALSE 的表达式。 如果布尔表达式中含有 SELECT 语句,则必须用括号将 SELECT 语句括起来。

{ sql_statement| statement_block }
任何 Transact-SQL 语句或用语句块定义的语句分组。 除非使用语句块,否则 IF 或 ELSE 条件只能影响一个 Transact-SQL 语句的性能。

* 若要定义语句块,请使用控制流关键字 BEGIN 和 END

* ELSE语句并不是必要的,可以只有IF语句

示例:

示例1(简单的IF...ELSE运用):

IF DATENAME(weekday, GETDATE()) IN (N'Saturday', N'Sunday')
       SELECT 'Weekend';
ELSE 
       SELECT 'Weekday';

示例2(利用BEGIN...END语句并缺省ELSE语句的条件控制):

create proc AddCase @Number nvarchar(max), @Title nvarchar(max), @SLAEndTime datetime, @IR nvarchar(16), @CallingCountry nvarchar(10), @CurrentQueue nvarchar(max)
as
declare @cnt int
set @cnt = (select count(*) from [Case] as c where c.Number = @Number)
if @cnt = 0
begin
    declare @a uniqueidentifier
    set @a = newID()
    insert into [Case] values(@a, @Number, @Title, @SLAEndTime, @IR, @CallingCountry,     @CurrentQueue)
    insert into [IsReviewed] values(newID(), @a, 0)
    insert into [IsMisrouted] values(newID(), @a, null)
end

RETURN

从查询或过程中无条件退出。 RETURN 的执行是即时且完全的,可在任何时候用于从过程、批处理或语句块中退出。 RETURN 之后的语句是不执行的

语法:

RETURN [ integer_expression ]   

参数:

integer_expression
返回的整数值。

存储过程可向执行调用的过程或应用程序返回一个整数值。

* 除非另外说明,否则所有系统存储过程都将返回一个 0 值。 此值表示成功,非 0 值表示失败

示例:

示例1:从过程返回

CREATE PROCEDURE findjobs @nm sysname = NULL  
AS   
IF @nm IS NULL  
    BEGIN  
        PRINT 'You must give a user name'  
        RETURN  
    END  
ELSE  
    BEGIN  
        SELECT o.name, o.id, o.uid  
        FROM sysobjects o INNER JOIN master..syslogins l  
            ON o.uid = l.sid  
        WHERE l.name = @nm  
    END;

示例2:返回状态代码

USE AdventureWorks2012;  
GO  
CREATE PROCEDURE checkstate @param varchar(11)  
AS  
IF (SELECT StateProvince FROM Person.vAdditionalContactInfo WHERE ContactID = @param) = 'WA'  
    RETURN 1  
ELSE  
    RETURN 2;  
GO

WHILE

设置重复执行 SQL 语句或语句块的条件。 只要指定的条件为真,就重复执行语句。

可以使用 BREAK 和 CONTINUE 关键字在循环内部控制 WHILE 循环中语句的执行。

语法:

-- Syntax for SQL Server and Azure SQL Database  

WHILE Boolean_expression   
     { sql_statement | statement_block | BREAK | CONTINUE }

参数:

Boolean_expression
返回 TRUE 或 FALSE 的表达式。 如果布尔表达式中含有 SELECT 语句,则必须用括号将 SELECT 语句括起来。

{sql_statement | statement_block}
Transact-SQL 语句或用语句块定义的语句分组。 若要定义语句块,请使用控制流关键字 BEGIN 和 END。

BREAK
导致从最内层的 WHILE 循环中退出。 将执行出现在 END 关键字后面的任何语句,END 关键字为循环结束标记。

CONTINUE
使 WHILE 循环重新开始执行,忽略 CONTINUE 关键字后面的任何语句。

示例:

USE AdventureWorks2012;  
GO  
WHILE (SELECT AVG(ListPrice) FROM Production.Product) < $300  
BEGIN  
   UPDATE Production.Product  
      SET ListPrice = ListPrice * 2  
   SELECT MAX(ListPrice) FROM Production.Product  
   IF (SELECT MAX(ListPrice) FROM Production.Product) > $500  
      BREAK  
   ELSE  
      CONTINUE  
END  
PRINT 'Too much for the market to bear';

WAITFOR

在达到指定时间或时间间隔之前,或者指定语句至少修改或返回一行之前,阻止执行批处理、存储过程或事务

语法:

WAITFOR   
{  
    DELAY 'time_to_pass'   
  | TIME 'time_to_execute'   
  | [ ( receive_statement ) | ( get_conversation_group_statement ) ]   
    [ , TIMEOUT timeout ]  
}

参数:

DELAY
可以继续执行批处理、存储过程或事务之前必须经过的指定时段,最长可为 24 小时。

'time_to_pass'
等待的时段。 可以使用 datetime 数据可接受的格式之一指定 time_to_pass,也可以将其指定为局部变量。 不能指定日期;因此,不允许指定 datetime 值的日期部分。 这将被格式化为 hh:mm[[:ss].mss]。

TIME
指定的运行批处理、存储过程或事务的时间。

'time_to_execute'
WAITFOR 语句完成的时间。 可以使用 datetime 数据可接受的格式之一指定 time_to_execute,也可以将其指定为局部变量。 不能指定日期;因此,不允许指定 datetime 值的日期部分。 这将被格式化为 hh:mm[[:ss].mss],并且可以选择包括 1900-01-01 的日期。

receive_statement
有效的 RECEIVE 语句。

get_conversation_group_statement
有效的 GET CONVERSATION GROUP 语句。

TIMEOUT timeout
指定消息到达队列前等待的时间(以毫秒为单位)。

示例:

示例1:WAITFOR DELAY

BEGIN  
    WAITFOR DELAY '02:00';  
    EXECUTE sp_helpdb;  
END;  
GO

示例2:WAITFOR TIME

EXECUTE sp_add_job @job_name = 'TestJob';  
BEGIN  
    WAITFOR TIME '22:20';  
    EXECUTE sp_update_job @job_name = 'TestJob',  
        @new_name = 'UpdatedJob';  
END;  
GO

异常处理:

此外,SQLServer的控制流还包括用于异常处理的TRY...CATCH和THROW语句,另行说明

猜你喜欢

转载自blog.csdn.net/stringYY/article/details/82185015