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语句,另行说明