合并多个存储过程的结果

时间:2013-07-26 14:54:22

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

我有3个存储过程(spData1, spData2, spData3),用于查询由(tSites, tInspections)键链接的两个表SiteID的区域摘要结果。由于不同的连接方法和所需摘要信息的GROUP BY要求,我无法组合查询。每个存储过程都会获取他们想要摘要信息的年份的@Year (smallint)参数。为了使事情变得非常有趣,程序并不总是返回相同数量的记录,具体取决于年份。

  1. spData1返回RegionName,TotalSitesVisited和TotalViolations
  2. spData2返回RegionName和TotalSiteVisits
  3. spData3返回RegionName和TotalBadSites
  4. 如何创建第四个存储过程以在一个结果中返回所有这些信息:

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

    谢谢!

1 个答案:

答案 0 :(得分:0)

在过程开始时(spData4)创建三个临时表,它们对应于三个存储过程的输出列。

使用INSERT..EXEC运行所有3个sps并将数据插入3个临时表。

最后编写一个查询,其中包含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表。最后以同样的方式加入。

相关问题