2017-07-20 43 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