2012-04-12 87 views
5

我有一个存储过程返回两个选择,我在报告中使用。 第一个选择是数据以表格格式和所述第二显示被元数据报告头进行显示,象下面显示:如何选择[临时表1] = [子选择1],[临时表2] = [子选择2] FROM [存储过程]

CREATE PROCEDURE dbo. GetReport  
@Input INT 
AS 
BEGIN   
    --Get #Metadata  
    -- #Results = f(#Metadata) … compex calculation   
    SELECT * FROM #Results  
    SELECT * FROM #Metadata  
END 

作为存储过程的计算是相当密集的,我想准备报告线作为普通数据(在两个表中:PrecalcResults和PrecalcMetadata),用于一些通常使用的sproc参数。 我会直接选择预先计算的vaues或根据参数用sproc来计算它们。

出于维护原因,我想用相同的存储过程来计算,这将是数据: 1.显示在 2被存储在PrecalcResults和PrecalcMetadata(与所使用的参数)的报告

如果我将有单选择存根我会采取一种方式desctibed在这里: Insert results of a stored procedure into a temporary table

由于我有多选择存根,我想要做类似上面,但有两个表。 在.net中,我会做DataSet.Tables [0]和DataSet.Tables [1] ...,但我想在tsql中执行它,在日常工作中运行它。

这甚至可能在MS SQL?


我必须自我道歉,从下面的答案我可以看到我不是很清楚。 我希望将这个功能作为纯粹的TSQL来实现。

+0

尝试搜索“多个活动的记录集”(又名MARS)。您需要使用“NextRecordset”方法从一个记录集移动到下一个记录集。 – HABO 2012-04-12 19:46:04

回答

2

是的,这是可能的。

It's perfectly fine to return multiple result sets from a single stored procedure as you have suggested.

你唯一的潜在问题是TableAdapter能够从存储过程拉两个结果集的限制,but there's a very simple work-around for that issue.

+0

除非它是临时表,否则将不会被发现,因为它只存在于服务器上 – Taryn 2012-04-12 19:54:27

+0

@bluefeet这并不是我的经验......这可能是您的数据访问层的问题,或者试图引用临时表在单独的连接上...对于select语句的源是否是临时表或非临时表,它应该对客户端不可见。 – 2012-04-12 19:58:14

+0

那么它取决于你如何使用它,如果你有一个临时表返回存储过程中的数据,并且你将存储过程添加到DataSet.xsd文件。我的经验是,它不知道临时表,因为它只存在于服务器上 – Taryn 2012-04-12 20:07:18