一、FFatherProcedure
1
CREATE
PROCEDURE
FFatherProcedure
2 @RetCode INT OUTPUT
3 AS
4
5 BEGIN
6 SET @RetCode = 0 ;
7 SELECT @RetCode
8 RETURN
9 END
2 @RetCode INT OUTPUT
3 AS
4
5 BEGIN
6 SET @RetCode = 0 ;
7 SELECT @RetCode
8 RETURN
9 END
二、FSonProcedure1
1
CREATE
PROCEDURE
FSonProcedure1
2 @RetCode INT OUTPUT
3 AS
4
5 BEGIN
6 SET @RetCode = 1 ;
7 SELECT @RetCode
8 RETURN
9 END
2 @RetCode INT OUTPUT
3 AS
4
5 BEGIN
6 SET @RetCode = 1 ;
7 SELECT @RetCode
8 RETURN
9 END
三、FSonProcedure2
1
CREATE
PROCEDURE
FSonProcedure2
2 @RetCode INT OUTPUT
3 AS
4
5 BEGIN
6 SET @RetCode = 2 ;
7 SELECT @RetCode
8 RETURN
9 END
2 @RetCode INT OUTPUT
3 AS
4
5 BEGIN
6 SET @RetCode = 2 ;
7 SELECT @RetCode
8 RETURN
9 END
先在查询分析器中执行这三个存储过程。
1
DECLARE
@RetCode
INT
2
3 EXECUTE FFatherProcedure @RetCode OUTPUT
4 EXECUTE FSonProcedure1 @RetCode OUTPUT
5 EXECUTE FSonProcedure2 @RetCode OUTPUT
2
3 EXECUTE FFatherProcedure @RetCode OUTPUT
4 EXECUTE FSonProcedure1 @RetCode OUTPUT
5 EXECUTE FSonProcedure2 @RetCode OUTPUT
返回的结果分别为0,1,2。
下面修改FFatherProcedure,然后执行。
1
set
ANSI_NULLS
ON
2 set QUOTED_IDENTIFIER ON
3 go
4
5 ALTER PROCEDURE [ dbo ] . [ FFatherProcedure ]
6 @RetCode INT OUTPUT
7 AS
8
9 BEGIN
10 SET @RetCode = 0 ;
11 EXECUTE FSonProcedure1 @RetCode OUTPUT
12 EXECUTE FSonProcedure2 @RetCode OUTPUT
13 SELECT @RetCode
14 END
2 set QUOTED_IDENTIFIER ON
3 go
4
5 ALTER PROCEDURE [ dbo ] . [ FFatherProcedure ]
6 @RetCode INT OUTPUT
7 AS
8
9 BEGIN
10 SET @RetCode = 0 ;
11 EXECUTE FSonProcedure1 @RetCode OUTPUT
12 EXECUTE FSonProcedure2 @RetCode OUTPUT
13 SELECT @RetCode
14 END
1
DECLARE
@RetCode
INT
2
3 EXECUTE FFatherProcedure @RetCode OUTPUT
2
3 EXECUTE FFatherProcedure @RetCode OUTPUT
返回的结果是1,1。
再修改FFatherProcedure为:
1
set
ANSI_NULLS
ON
2 set QUOTED_IDENTIFIER ON
3 go
4
5 ALTER PROCEDURE [ dbo ] . [ FFatherProcedure ]
6 @RetCode INT OUTPUT
7 AS
8
9 BEGIN
10 SET @RetCode = 0 ;
11 EXECUTE FSonProcedure1 @RetCode OUTPUT
12 EXECUTE FSonProcedure2 @RetCode OUTPUT
13 SELECT @RetCode
14 END
2 set QUOTED_IDENTIFIER ON
3 go
4
5 ALTER PROCEDURE [ dbo ] . [ FFatherProcedure ]
6 @RetCode INT OUTPUT
7 AS
8
9 BEGIN
10 SET @RetCode = 0 ;
11 EXECUTE FSonProcedure1 @RetCode OUTPUT
12 EXECUTE FSonProcedure2 @RetCode OUTPUT
13 SELECT @RetCode
14 END
再执行,返回的结果为1,2,2。这是因为在执行过存储过程FSonProcedure1之后又执行存储过程FSonProcedure2,@RetCode的值被FSonProcedure2覆盖了。再修改FFatherProcedure为:
1
set
ANSI_NULLS
ON
2 set QUOTED_IDENTIFIER ON
3 go
4
5 ALTER PROCEDURE [ dbo ] . [ FFatherProcedure ]
6 @RetCode INT OUTPUT
7 AS
8
9 BEGIN
10 SET @RetCode = 0 ;
11 EXECUTE FSonProcedure2 @RetCode OUTPUT
12 EXECUTE FSonProcedure1 @RetCode OUTPUT
13 SELECT @RetCode
14 END
2 set QUOTED_IDENTIFIER ON
3 go
4
5 ALTER PROCEDURE [ dbo ] . [ FFatherProcedure ]
6 @RetCode INT OUTPUT
7 AS
8
9 BEGIN
10 SET @RetCode = 0 ;
11 EXECUTE FSonProcedure2 @RetCode OUTPUT
12 EXECUTE FSonProcedure1 @RetCode OUTPUT
13 SELECT @RetCode
14 END
返回的结果是2,1,1。
再修改FFatherProcedure为:
1
set
ANSI_NULLS
ON
2 set QUOTED_IDENTIFIER ON
3 go
4
5 ALTER PROCEDURE [ dbo ] . [ FFatherProcedure ]
6 @RetCode INT OUTPUT
7 AS
8
9 BEGIN
10 SET @RetCode = 0 ;
11 EXECUTE FSonProcedure2 @RetCode OUTPUT
12 RETURN
13 EXECUTE FSonProcedure1 @RetCode OUTPUT
14 SELECT @RetCode
15 END
2 set QUOTED_IDENTIFIER ON
3 go
4
5 ALTER PROCEDURE [ dbo ] . [ FFatherProcedure ]
6 @RetCode INT OUTPUT
7 AS
8
9 BEGIN
10 SET @RetCode = 0 ;
11 EXECUTE FSonProcedure2 @RetCode OUTPUT
12 RETURN
13 EXECUTE FSonProcedure1 @RetCode OUTPUT
14 SELECT @RetCode
15 END
返回的结果值为2。
到此而看,存储过程中的RETURN,仅仅是直接跳出当前所在存储过程而已,他还是忠实地把RETURN前所设置的值返回给调用他的父存储过程。而在父存储过程中,如果不使用GOTO语句,会按照顺序逐一赋值,最后处理的结果会覆盖前面的结果。