2012-04-12 89 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