存储过程A如何获取存储过程B中return的值和select表的数据

peterpansh 2006-06-25 10:00:41
存储过程A如何获取存储过程B中return的值和select表的数据
...全文
393 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
boylynn 2006-06-26
  • 打赏
  • 举报
回复
从查询或过程中无条件退出。RETURN 的执行是即时且完全的,可在任何时候用于从过程、批处理或语句块中退出。RETURN 之后的语句是不执行的。
语法:
RETURN [ integer_expression ]
备注:
如果用于存储过程,RETURN 不能返回空值。如果某个过程试图返回空值(例如,使用 RETURN @status,而 @status 为 NULL),则将生成警告消息并返回 0 值。

在执行了当前过程的批处理或过程中,可以在后续的 Transact-SQL 语句中包含返回状态值,但必须以下列格式输入:EXECUTE @return_status = <procedure_name>。

注意:
兼容级别设置确定了是将空字符串 (NULL) 解释为单个空格,还是解释为真正的空字符串。如果兼容级别小于或等于 65,SQL Server 2005 会将空字符串解释为单个空格。如果兼容级别等于 70,SQL Server 会将空字符串解释为空字符串。
参数:
integer_expression返回的整数值。存储过程可向执行调用的过程或应用程序返回一个整数值。

示例:
A. 从过程返回
以下示例显示如果在执行 findjobs 时没有指定用户名作为参数,则 RETURN 将使过程向用户屏幕发送一条消息后退出。如果指定了用户名,则将从相应的系统表中检索此用户在当前数据库创建的所有对象名。
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;
B. 返回状态代码
以下示例将检查指定联系人的 ID 的状态。如果所在的州是 Washington (WA),将返回状态代码 1。在其他情况下(StateProvince 的值是 WA 以外的值,或者 ContactID 没有匹配的行),返回状态代码 2。

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


以下示例显示执行 checkstate 返回的状态。第一个示例显示的联系人在华盛顿;第二个示例显示的联系人不在华盛顿;第三个示例显示的联系人无效。局部变量 @return_status 必须在使用前声明。

DECLARE @return_status int;
EXEC @return_status = checkstate '2';
SELECT 'Return Status' = @return_status;
GO


下面是结果集:

Return Status
-------------
1


指定一个不同的联系人编号,再执行一次该查询。


DECLARE @return_status int;
EXEC @return_status = checkstate '6';
SELECT 'Return Status' = @return_status;
GO


下面是结果集:


Return Status
-------------
2


指定另一个联系人编号,再执行一次该查询。


DECLARE @return_status int
EXEC @return_status = checkstate '12345678901';
SELECT 'Return Status' = @return_status;
GO


下面是结果集:


Return Status
-------------
2
hellowork 2006-06-26
  • 打赏
  • 举报
回复
从存储过程返回表类型的值也有二种:
1.存储过程使用浮标参数,即同时指定CURSOR VARYING OUTPUT项.调用者可以使用while及fetch循环遍历该浮标.
2.直接将存储过程返回的结果集插入到表中,即使用insert into 表名 exec 存储过程.此种方式中注意存储过程返回的结果集列与insert的列要完全对应,可以在insert中指定列名来保证对应关系.
------------------------------------------------------------------------------
测试:
------------------------------------------------------------------------------
----建立测试用的临时表
create table #tmp (colx int,coly int)
insert into #tmp values(1,2)
insert into #tmp values(2,3)
insert into #tmp values(3,4)
select * from #tmp
GO
----创建返回游标的存储过程
create proc sp_c @cur CURSOR VARYING OUTPUT
AS
begin
set @cur = CURSOR for select colx from #tmp
open @cur /*该过程返回游标,该游标为colx列的查询结果*/
end
GO
----创建返回表的存储过程
create proc sp_d
as
select coly from #tmp /*该过程返回coly列的查询结果*/
go
----创建用于调用以上二个存储过程的存储过程
create proc sp_e
as
begin
declare @x int
declare @cur cursor
----接收游标,并遍历游标
EXEC sp_c @cur OUTPUT
fetch next from @cur into @x
while (@@FETCH_STATUS = 0)
begin
print @x
fetch next from @cur into @x
END
close @cur
deallocate @cur
----将存储过程返回的列值再重新插入源表中
insert into #tmp(coly) EXEC sp_d
select * from #tmp
end
GO
EXEC sp_e
drop proc sp_c
drop proc sp_d
drop proc sp_e
drop table #tmp
hellowork 2006-06-26
  • 打赏
  • 举报
回复
从存储过程返回非表类型的值有二种方法:
1.存储过程使用return语句返回值.此种情况下,接收该存储过程值的方法是:
delcare @ReturnValue int /*(与存储过程return语句返回值的类型相同)*/
exec @ReturnValue = StoredProc
2.存储过程使用OUTPUT输出参数.此种情况下,直接使用OUTPUT输出参数即可:
declare @id int
set @id = 1
exec StoreProc @id OUTPUT
select @id
测试:
create proc sp_b @id int OUTPUT
AS
begin
set @id = 100 /*为输出参数赋值*/
return 99 /*返回值*/
end
go
create proc sp_a
as
begin
declare @rtv int
declare @id int
exec @rtv = sp_b @id OUTPUT
print @rtv
print @id
end
go
exec sp_a
drop proc sp_a
drop proc sp_b

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧