如何从存储过程中选择 [临时表1] = [子查询1], [临时表2] = [子查询2]

5

我有一个储存过程,返回两个select语句,我在报表中使用。 第一个select是以表格形式展示的数据,第二个是在报表头部展示的元数据,如下所示:

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

由于sproc计算相当复杂,我希望为一些常用的sproc参数准备报告行作为纯数据(分别存储在PrecalcResults和PrecalcMetadata两个表中)。之后,我将直接选择预先计算的值或根据参数使用sproc进行计算。
出于维护原因,我希望使用相同的sproc计算数据,这些数据将: 1. 在报告中显示 2. 存储在PrecalcResults和PrecalcMetadata中(带有所使用的参数)
如果我有单个选择sproc,我会采用这里描述的方法: 将存储过程的结果插入临时表中 由于我有多个选择的sproc,我想采用类似上述的方法,但是使用两个表。 在.net 中,我会使用 DataSet.Tables[0] 和 DataSet.Tables[1]...,但我想在tsql中运行它,以便每日执行。
这在MS SQL中是否可行?
我必须道歉,从下面的答案中我可以看出我的表述不是很清晰。我希望实现这个功能作为纯TSQL。

试着搜索“多个活动记录集”(也称为MARS)。您需要使用NextRecordset方法来从一个记录集移动到下一个。 - HABO
1个回答

2

除非它是临时表,否则它将找不到,因为它只存在于服务器上。 - Taryn
@bluefeet,这不是我的经验...这可能是您的数据访问层出了问题,或者尝试在单独的连接上引用临时表...对于客户端来说,选择语句的源是临时表还是非临时表应该是不可见的。 - Michael Fredrickson
这取决于你如何使用它,如果你在存储过程中返回数据并添加存储过程到 DataSet.xsd 文件中,则我的经验是此时它不会意识到临时表的存在,因为它仅存在于服务器上。 - Taryn
@bluefeet 啊...这是因为Visual Studio正在采取捷径,试图确定存储过程的元数据,而不实际执行它,这就是临时表引起问题的地方。如果您在包含临时表的存储过程顶部添加 SET FMTONLY OFF,它将按预期工作。请参阅此讨论以了解该问题。 - Michael Fredrickson
哇,太棒了,我之前不知道这个。将来的项目中我得牢记这点。 - Taryn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接