I have a query to retrieve all the modules and child modules for a page, using a common table expression. Is it possible to use the results from the cte more than once?
example
WITH top_level_modules (
[AppContentModuleID]
,[SortIndex]
,[ContentHolderName]
,[OwnerType]
,[AppContentModuleGuid]
,[parent_AppContentModuleID]
,[ModuleID]
,[RenderIDTag]
,[WrapperType]
,[Level]
)
AS
(
SELECT amcp.[AppContentModuleID]
,amcp.[SortIndex]
,amcp.[ContentHolderName]
,1
,amc.[AppContentModuleGuid]
,amc.[parent_AppContentModuleID]
,amc.[ModuleID]
,amc.[RenderIDTag]
,amc.[WrapperType]
,0 AS [Level]
FROM [dbo].[application_module_content_page] amcp
INNER JOIN [dbo].[application_module_content] amc on amcp.[AppContentModuleID] = amc.[AppContentModuleID]
WHERE amcp.[PageID] = @PageID
UNION
SELECT amcm.[AppContentModuleID]
,amcm.[SortIndex]
,amcm.[ContentHolderName]
,2
,amc.[AppContentModuleGuid]
,amc.[parent_AppContentModuleID]
,amc.[ModuleID]
,amc.[RenderIDTag]
,amc.[WrapperType]
,0
FROM [dbo].[application_module_content_masterpage] amcm
INNER JOIN [dbo].[application_module_content] amc on amcm.[AppContentModuleID] = amc.[AppContentModuleID]
WHERE amcm.[AppMasterPageID] = @MasterPageID
),
child_modules AS
(
SELECT tlm.[AppContentModuleID]
,tlm.[SortIndex]
,tlm.[ContentHolderName]
,tlm.[OwnerType]
,tlm.[AppContentModuleGuid]
,tlm.[parent_AppContentModuleID]
,tlm.[ModuleID]
,tlm.[RenderIDTag]
,tlm.[WrapperType]
,tlm.[Level]
FROM top_level_modules tlm
UNION ALL
SELECT
amc.[AppContentModuleID]
,CASE WHEN amc.[SortIndex] IS NULL THEN tlm.[SortIndex] ELSE amc.[SortIndex] END
,null
,3
,amc.[AppContentModuleGuid]
,amc.[parent_AppContentModuleID]
,amc.[ModuleID]
,amc.[RenderIDTag]
,amc.[WrapperType]
,[Level] + 1 AS [Level]
FROM [dbo].[application_module_content] amc
INNER JOIN child_modules tlm on tlm.[AppContentModuleID] = amc.[parent_AppContentModuleID]
)
SELECT *
FROM child_modules cm
ORDER BY cm.[OwnerType]
, cm.[Level]
, cm.[SortIndex]
SELECT apcs.[StyleType]
,apcs.[StyleName]
,apcs.[StyleValue]
FROM child_modules cm
INNER JOIN dbo.[application_module_content_style] apcs
on cm.AppContentMdouleID = apcs.AppContentMdouleID
The first select works, but the second select throws up the error "Invalid object name 'child_modules'."
From the WITH common_table_expression manual:
Specifies a temporary named result set, known as a common table expression (CTE). This is derived from a simple query and defined within the execution scope of a single SELECT, INSERT, UPDATE, or DELETE statement.
So, no, you can't extend the scope of the CTE beyond the SELECT statement it was defined in. You will have to store the result in a temporary table or table valued variable if you want to use the result more than once.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With