目录
1.使用RETURN
RETURN用来立即退出当前的T-SQL批处理、查询或存储过程,并且不执行它之后的批处理/查询/过程域中的任何代码。RETURN仅退出当前域中执行的代码。如果在存储过程A中调用了存储过程B,并且存储过程B发起一个RETURN,那么存储过程B会立即终止,但是存储过程A还会继续,就好像B已经成功完成。
示例1:使用RETURN来无条件终止一个查询:
USE AdventureWorks
GO
IF NOT EXISTS
(SELECT ProductID FROM Production.Product WHERE Color='Pink')
BEGIN
RETURN
END
--不会再执行
SELECT ProductID
FROM Production.Product
WHERE Color='Pink'
示例2:RETURN支持可选的整数表达式:
RETURN[integer_expression]
这个整数值能用于存储过程和调用应用程序的通信,例如:
USE AdventureWorks
GO
CREATE PROCEDURE #usp_TempProc
AS
SELECT 1/0
RETURN @@ERROR
GO
--执行存储过程,从局部变量捕获RETURN代码
DECLARE @ErrorCode int
EXEC @ErrorCode=#usp_TempProc
PRINT @ErrorCode
示例演示了创建一个临时存储过程,它包含了创建以O作除数的错误的T-SQL。RETURN用来捕获@@ERRORCODE值8134,它返回给调用者并通过@ErrorCode局部变鼍打印出来。如果整数值没有显式放入RETURN的调用,那么会发送0作为默认值。
2.使用WHILE
WHILE的语法如下;
WHILE Boolean_expression
{ sql_statement | statement_block | BREAK | CONTINUE }
只要布尔表达式还是TRUE, WHILE就会保证T-SQL语句或者批处理。一直处理。使用BREAK关键字可
以从最内部的WHILE循环中退出,CONTINUE关键字导致循环重启动。
示例1:系统存储过程sp_spaceused用来返回@AWTables表变量中每个表的空间占用情况:
USE AdventureWorks
GO
--声明变量
DECLARE @AWTables TABLE(SchemaTable varchar(100))
DECLARE @TableName varchar(100)
--把表名插入表变量
INSERT @AWTables
(SchemaTable)
SELECT TABLE_SCHEMA+ '.' + TABLE_Name
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
ORDER BY TABLE_SCHEMA + '.' +TABLE_NAME
--使用sp_spaceused汇报每个表的空间使用情况
WHILE (SELECT COUNT(*) FROM @AWTables)>0
BEGIN
SELECT TOP 1 @TableName=SchemaTable
FROM @AWTables
ORDER BY SchemaTable
EXEC sp_spaceused @TableName
DELETE @AWTables
WHERE SchemaTable=@TableName
END
示例2: WHILE命令可以在代码中使用关键字BREAK和CONTINUE。BREAK用来退出WHILE循环,而CONTINUE用来继续WHILE循环。例如:
WHILE(1=1)
BEGIN
PRINT 'Endless While,because 1 always equals 1'
if 1=1
BEGIN
PRINT 'But we didn''t let the endless loop happen'
BREAK
END
ELSE
BEGIN
CONTINUE
END
END
3.使用GOTO
USE AdventureWorks
GO
DECLARE @Name nvarchar(50)='Engineering'
DECLARE @GroupName nvarchar(50)='Research and Development'
DECLARE @Exist bit=0
IF EXISTS (SELECT Name FROM HumanResources.Department WHERE Name=@Name)
BEGIN
SET @Exist=1
GOTO SkipInsert
END
INSERT HumanResources.Department
(Name,GroupName)
VALUES(@Name,@GroupName)
SkipInsert:
IF @Exist=1
BEGIN
PRINT @Name + ' already exists in HumanResources.Department'
END
ELSE
BEGIN
PRINT 'Row added'
END
4.使用WAITFOR
’WAITFOR命令将T-SQL的执行延迟指定的一段时间:
WAITFOR
{
DELAY 'time_to_pass'
| TIME 'time_to_execute'
| [ ( receive_statement ) | ( get_conversation_group_statement ) ]
[ , TIMEOUT timeout ]
}
WAITFOR DELAY的time to_pass参数是在执行命令前等待的秒数、分钟数和小时数。WAITFOR TIME的time_to_execute参数用来指定执行批处理的实际时间(小时、分钟和秒)。receive_statement和TIMEOUT选项用来和Service Broker一起使用。
示例1:在SELECT查询执行之前通过WAITFOR创建一个10秒的延迟:
WAITFOR DELAY '00:00:10'
BEGIN
SELECT TransactionID,Quantity
FROM Production.TransactionHistory
END
示例2:查询直到指定时间才会执行,在这里是7:01PM:
USE AdventureWorks
GO
WAITFOR TIME '19:01:00'
BEGIN
SELECT COUNT(*)
FROM Production.TransactionHistory
END