2013-07-26 49 views
0

我有3個存儲過程(spData1, spData2, spData3),它們查詢由SiteID鍵鏈接的兩個表(tSites, tInspections)的區域摘要結果。由於不同的連接方法和所需摘要信息的GROUP BY要求,我無法組合查詢。每個存儲過程在他們想要摘要信息的年份中採用@Year (smallint)參數。爲了使事情變得非常有趣,程序並不總是返回相同數量的記錄,這取決於年份。結合來自多個存儲過程的結果

  1. spData1返回RegionName,TotalSitesVisited和TotalViolations
  2. spData2返回RegionName和TotalSiteVisits
  3. spData3返回RegionName和TotalBadSites

如何創建第四個存儲過程返回所有這些信息在一個結果中:

spData4返回RegionName, TotalSitesVisited, TotalViolations, TotalSiteVisits, TotalBadSites

謝謝!

回答

0

在過程的開始階段(spData4),創建三個臨時表,這些表對三個存儲過程的輸出列進行覈對。

使用INSERT..EXEC運行所有3個sps並將數據插入到3個臨時表中。

在最後寫JOIN的3代臨時表的結果,從過程中返回它作爲SELECT

像這樣的查詢(修正爲您正確的列類型):

CREATE PROCEDURE spData4 (@Year smallint) 
AS 
BEGIN 

CREATE TABLE #temp1 (RegionName NVARCHAR(50), TotalSitesVisited INT, TotalViolations INT) 
CREATE TABLE #temp2 (RegionName NVARCHAR(50), TotalSiteVisits INT) 
CREATE TABLE #temp3 (RegionName NVARCHAR(50), TotalBadSites INT) 

INSERT INTO #temp1 EXEC spData1 @Year 
INSERT INTO #temp2 EXEC spData2 @Year 
INSERT INTO #temp3 EXEC spData3 @Year 

SELECT 
    COALESCE(t1.RegionName, t2.RegionName, t3.RegionName) RegionName 
    ,TotalSitesVisited,TotalViolations,TotalSiteVisits,TotalBadSites 
FROM #temp1 t1 
FULL JOIN #temp2 t2 ON t1.RegionName = t2.RegionName 
FULL JOIN #temp3 t3 ON t1.RegionName = t3.RegionName OR t2.RegionName = t3.RegionName 

END 

另外,如果你不再需要舊的SP,那麼你可以從這三個SP中複製你的代碼,並將它作爲三個獨立的部分,每個部分填充它自己的#temp表。以同樣的方式加入最後。

相關問題