使用CTE的结果从没有光标的表中查询

时间:2017-07-20 10:22:54

标签: sql sql-server common-table-expression

我需要从表中查询,这是CTE查询的结果,例如

;WITH CTE
AS
( 
  SELECT TableName
    FROM dbo.TableContainingListOfTableNames        
)
SELECT * FROM CTE

这将返回我需要查询数据的表的名称。

Names of tables returned from table store

我可以使用CTE从相应的表中查询,例如SELECT * FROM dbo.[1006UN]?我知道我可以使用临时表来存储这些值,并使用游标迭代动态sql但我不想使用游标,如果可能的话。

我尝试了一些简单的事情:

SELECT * FROM dbo.[CTE]

这给了我错误:

  

无效的对象名称' dbo.CTE'。

并且进一步尝试在CTE中使用动态SQL:

DECLARE @query1 VARCHAR(MAX)
SELECT @query1 = N';WITH CTE
AS
(
  SELECT TableName  
    FROM dbo.TableContainingListOfTableNames    
)
SELECT * FROM dbo.["' + CTE + '"] '

EXECUTE(@query1)

这给了我错误:

  

列名称无效' CTE'。

首先,是否有可能实现这一目标?如果没有,是否有任何替代方案可以实现这一点(避免使用游标)?

1 个答案:

答案 0 :(得分:4)

可以做到。如果您使用CTE则无关紧要。获得表名后,可以创建和连接动态SELECT语句。

DECLARE @query NVARCHAR(MAX) = '';

WITH CTE AS
( 
  SELECT TableName
  FROM dbo.TableContainingListOfTableNames        
)
SELECT @query = @query + 'SELECT * FROM ' + QUOTENAME(TableName) + '; '
FROM CTE;

PRINT @query; --run print first to check
EXEC (@query);