SqlServer2008实例49流控制

本文详细介绍了SQL Server 2008中流控制的四种关键操作:使用RETURN立即退出批处理或存储过程,WHILE循环结构用于重复执行直到条件不满足,GOTO语句实现跳转,以及WAITFOR命令用于延迟执行或指定执行时间。示例包括RETURN的整数值通信,WHILE循环中的BREAK和CONTINUE,以及WAITFOR的DELAY和TIME用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 

1.使用RETURN

2.使用WHILE

3.使用GOTO

4.使用WAITFOR


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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ngbshzhn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值