我有3个存储过程(spData1, spData2, spData3)
,用于查询由(tSites, tInspections)
键链接的两个表SiteID
的区域摘要结果。由于不同的连接方法和所需摘要信息的GROUP BY要求,我无法组合查询。每个存储过程都会获取他们想要摘要信息的年份的@Year (smallint)
参数。为了使事情变得非常有趣,程序并不总是返回相同数量的记录,具体取决于年份。
如何创建第四个存储过程以在一个结果中返回所有这些信息:
spData4
返回RegionName, TotalSitesVisited, TotalViolations, TotalSiteVisits, TotalBadSites
谢谢!
答案 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表。最后以同样的方式加入。