AS 
set NOCOUNT ON;
IF OBJECT_ID('tempdb..#programWithAlias') IS NOT NULL DROP TABLE #programWithAlias
			 SELECT Programs.OccurID, Programs.Ancestor, Programs.ProgramID, Programs.ProgramTypeID,
				pa.AliasName AS ProgramName
			 INTO #programWithAlias 
			 FROM  dbo.Programs INNER JOIN dbo.ProgramAliases pa  ON Programs.ProgramID = pa.ProgramId and pa.AliasType = 0

SELECT DISTINCT 
      Programs_1.ProgramID, Programs_1.ProgramName, ProgramTypes_1.ProgramTypeID, Statements.Description, 
      Programs_2.ProgramID AS CalledProgId, Programs_2.ProgramName AS CalledProgramName, Programs_2.ProgramTypeID AS CalledProgramTypeID, 
      OccurrencesStmt.StatementType, Paths.PathStr, Paths_1.PathStr AS Path2, Programs_1.Ancestor AS AncestorName, Programs_2.Ancestor AS CalledAncestorName,
      Ancestor.ProgramID as CalledAncestorID, OccurrencesStmt.StartRow, OccurrencesStmt.EndRow, OccurrencesStmt.StartCol, OccurrencesStmt.EndCol, null, StatementReference.OccurID
FROM         Paths Paths_1 INNER JOIN
      Occurrences ON Paths_1.PathID = Occurrences.PathID RIGHT OUTER JOIN
      ProgramTypes ProgramTypes_1 INNER JOIN
      #programWithAlias Programs_1 ON ProgramTypes_1.ProgramTypeID = Programs_1.ProgramTypeID INNER JOIN
      StatementReference INNER JOIN
      
      OccurrencesStmt ON StatementReference.OccurID = OccurrencesStmt.OccurID INNER JOIN
      Statements ON OccurrencesStmt.StatementType = Statements.StatementType ON 
      Programs_1.ProgramID = OccurrencesStmt.ProgID INNER JOIN
      #programWithAlias Programs_2 ON StatementReference.ResourceID = Programs_2.ProgramID INNER JOIN
      Paths ON OccurrencesStmt.PathID = Paths.PathID ON Occurrences.OccurID = Programs_2.OccurID
      LEFT JOIN #programWithAlias Ancestor on Programs_2.Ancestor = Ancestor.ProgramName
WHERE     (StatementReference.ResourceType = 5) AND (Programs_1.ProgramID IN (Select * from #numeric_param_temp)) 
			AND (Ancestor.ProgramTypeID IS NULL OR Ancestor.ProgramTypeID NOT IN (15, 16, 19))


		UNION
	SELECT DISTINCT 
      Programs_1.ProgramID, Programs_1.ProgramName, ProgramTypes_1.ProgramTypeId, Statements.Description, 
      Programs_2.ProgramID AS CalledProgId, Programs_2.ProgramName AS CalledProgramName, Programs_2.ProgramTypeID AS CalledProgramTypeID, 
      OccurrencesStmt.StatementType, Paths.PathStr, Paths_1.PathStr AS Path2, Programs_1.Ancestor AS AncestorName, Programs_2.Ancestor AS CalledAncestorName, 
      Ancestor.ProgramID as CalledAncestorID, OccurrencesStmt.StartRow, OccurrencesStmt.EndRow, OccurrencesStmt.StartCol, OccurrencesStmt.EndCol, Resources.Name, StatementReference.OccurID
FROM         Paths Paths_1 INNER JOIN
      Occurrences ON Paths_1.PathID = Occurrences.PathID RIGHT OUTER JOIN
      ProgramTypes ProgramTypes_1 INNER JOIN
      #programWithAlias Programs_1 ON ProgramTypes_1.ProgramTypeID = Programs_1.ProgramTypeID INNER JOIN
      StatementReference INNER JOIN
      OccurrencesStmt ON StatementReference.OccurID = OccurrencesStmt.OccurID INNER JOIN
      Statements ON OccurrencesStmt.StatementType = Statements.StatementType ON 
      Programs_1.ProgramID = OccurrencesStmt.ProgID INNER JOIN
      Resources ON StatementReference.ResourceID = Resources.ResourceID INNER JOIN
      #programWithAlias Programs_2 ON Resources.ProgName = Programs_2.ProgramName INNER JOIN
      Paths ON OccurrencesStmt.PathID = Paths.PathID ON Occurrences.OccurID = Programs_2.OccurID
      LEFT JOIN #programWithAlias Ancestor on Programs_2.Ancestor = Ancestor.ProgramName
WHERE     (StatementReference.ResourceType = 14)
		AND (Programs_1.ProgramID IN (Select * from #numeric_param_temp))
		AND (Ancestor.ProgramTypeID IS NULL OR Ancestor.ProgramTypeID NOT IN (15, 16, 19))
ORDER BY Programs_1.ProgramID, StatementReference.OccurID, CalledProgramTypeID desc