2017-07-20 36 views
2

我需要从查询结果为CTE的表中查询,例如,使用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] 

这给我的错误:

Invalid object name 'dbo.CTE'.

而且还更进一步尝试使用动态SQL与CTE:

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

EXECUTE(@query1) 

这给了我错误:

Invalid column name 'CTE'.

所以首先,是否有可能实现这一目标?如果不是,有没有其他办法可以实现这一点(避免游标)?

+0

cte不在'dbo'模式中。它在您的批次中临时构建,并且仅在此处可用。因此,通过'dbo。[CTE]'处理它不会工作,因为这样的对象不存在。 – Adwaenyth

+0

只是尝试'选择*从CTE' - 因为CTE只是一个“内联,内存中”的对象,它没有存储到任何模式中...... –

+0

你的表名实际上是'dbo。[TableName]'你'重新将cte的结果与动态sql混合,从表中读取。 – Jamiec

回答

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); 
+0

YES!这是我以后的事,谢谢。 – Sandman