【问题标题】:Combine results from multiple stored procedures合并来自多个存储过程的结果
【发布时间】:2013-07-26 14:54:21
【问题描述】:

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

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

如何创建第四个存储过程以在一个结果中返回所有这些信息:

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

    在您的过程 (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 表。最后以同样的方式加入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 2020-02-18
      相关资源
      最近更新 更多