如何在存储过程B中,对存储过程A的结果集进行查询

来源:互联网 发布:华为算法工程师笔试 编辑:程序博客网 时间:2024/04/28 07:15

问题:

 

有读者来信询问:如何在存储过程B里面使用存储过程A执行后的结果集?就是在存储过程B里面再对存储过程A的结果集进行查询。

 

解答:

 

建议您在存储过程中将另外一个存储过程的结果集先存放到一个暂存数据表,接着对此暂存数据表进行查询处理之后,然后再将最终的处理结果传出。

 

在此我们将示范如何在存储过程中使用名称以 # 开头的区域性暂存数据表以及table数据类型的变量来储存另外一个存储过程的结果集,并进行后续的处理。

 

程序范例一


以下的程序代码会先建立一个查询所有薪资与性别的存储过程(uspGetIncome),接着建立一个以「性别」为查询条件的存储过程(uspGetTotalIncomeByGender)。在存储过程uspGetTotalIncomeByGender中,我们会建立一个名称为#tmpTable 的暂存数据表,然后使用INSERT INTO ... EXECUTE <存储过程> 表达式将另外一个存储过程uspGetIncome 的结果集新增至暂存数据表中,接着以「性别」为分类条件,使用 SUM 函式来计算出不同性别的收入总计。最后,我们分别以男性与女性为输入参数呼叫存储过程 uspGetTotalIncomeByGender(执行结果如图表1所示):

 

...

-- 查询目前薪资之SP

CREATE PROCEDURE dbo.uspGetIncome

AS

SELECT 目前薪资, 性别 FROM 章立民研究室;

GO

 

-- 建立以「性别」为查询条件的 SP

-- 这个 SP 会呼叫上面的 SP

CREATE PROCEDURE dbo.uspGetTotalIncomeByGender

  @Gender nvarchar(1)

AS

-- 建立一个暂存数据表

CREATE TABLE #tmpTable (目前薪资 money, 性别 nvarchar(1));

INSERT INTO #tmpTable EXECUTE dbo.uspGetIncome;

-- 取得以性别为分类条件的收入总计

SELECT SUM(目前薪资) AS 收入总计 FROM #tmpTable WHERE 性别 = @Gender;

GO

 

-- 查询性别为「男」的员工收入总计

EXECUTE dbo.uspGetTotalIncomeByGender '男';

GO

 

-- 查询性别为「女」的员工收入总计

-- 省略 EXECUTE 关键词

-- 并指定 @Gender 这个参数名称来执行SP

-- 请注意,此时 SP 必须是表达式的第一道指令

dbo.uspGetTotalIncomeByGender @Gender = '女';

GO






    有些程序员喜欢使用存储过程来实现一些数据的查询工作,如果客户端用户(这里是指使用这些存储过程的程序员)想对得到的结果进行筛选,目前没有简单的办法,但是可以利用临时表作为折中的办法。



Create Table #TmpTable(FieldList)
Insert Into #TmpTable Exec StoreProcedureName ParameterList

需要指出创建临时表语句中的字段列表FeildList需要和存储过程返回的字段顺序一致;ParameterList是存储过程要用到的参数。执行完之后,

    就可以使用Select语句对刚创建的临时表进行条件查询了。最后不要忘记删除掉临时表。



原创粉丝点击