【问题标题】:How to SELECT [temp table1] = [subselect 1], [temp table2] = [subselect 2] FROM [Stored Procedure]如何从 [存储过程] 中选择 [temp table1] = [subselect 1]、[temp table2] = [subselect 2]
【发布时间】:2012-04-25 04:40:15
【问题描述】:

我有一个存储过程,它返回两个选择,我在报告中使用它。 第一个选择是以表格格式显示的数据,第二个是要显示在报表头中的元数据,如下所示:

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计算它们。

出于维护原因,我想使用相同的存储过程来计算以下数据: 1.在报告中显示 2. 存储在 PrecalcResults 和 PrecalcMetadata 中(带有使用的参数)

如果我有单选存储过程,我会在这里描述一种方法: Insert results of a stored procedure into a temporary table

由于我有 multiselect sproc,我想做类似上面的事情,但有两个表。 在 .net 中我会执行 DataSet.Tables[0] 和 DataSet.Tables[1]...,但我想在 tsql 中执行它,以便在日常工作中运行它。

这在 MS SQL 中是否可行?


我必须向自己道歉,从下面的答案中我可以看出我不是很清楚。 我想将此功能实现为纯 TSQL。

【问题讨论】:

  • 尝试搜索“多个活动记录集”(又名 MARS)。您需要使用 NextRecordset 方法从一个记录集移动到下一个记录集。

标签: sql tsql sql-server-2005 stored-procedures


【解决方案1】:

是的,这是可能的。

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. 中提取两个结果集的限制

【讨论】:

  • 除非是临时表,否则找不到,因为它只存在于服务器上
  • @bluefeet 这不是我的经验......这可能是您的数据访问层的问题,或者试图在单独的连接上引用临时表......它应该是不可见的客户端,无论 select 语句的源是临时表还是非临时表。
  • 这取决于您如何使用它,如果您有一个在存储过程中返回数据的临时表,并且您将存储过程添加到 DataSet.xsd 文件中。我的经验是它当时不知道临时表,因为它只存在于服务器上
  • @bluefeet 啊...那是因为 Visual Studio 正在走捷径并尝试确定存储过程的元数据而不实际执行它,这是临时表导致问题的地方。如果要将SET FMTONLY OFF 添加到包含临时表的存储过程的顶部,它将按预期工作。 Please see this discussion regarding the issue.
  • 哇,太棒了,我不知道。我需要在未来的项目中牢记这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
  • 2022-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多