我需要从表中查询,这是CTE
查询的结果,例如
;WITH CTE
AS
(
SELECT TableName
FROM dbo.TableContainingListOfTableNames
)
SELECT * FROM CTE
这将返回我需要查询数据的表的名称。
我可以使用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'。
首先,是否有可能实现这一目标?如果没有,是否有任何替代方案可以实现这一点(避免使用游标)?
答案 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);