2017-07-20 18 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で反復するためにカーソルを使用することができますが、私は可能な限りカーソルを使用したくありません。

Invalid object name '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) 
私にエラーを与える

SELECT * FROM dbo.[CTE] 

は私がような単純なものを試してみました

私にエラーが表示される:

Invalid column name 'CTE'.

だから、これを達成することは可能でしょうか?そうでない場合は、これを達成できる代替手段があります(カーソルを避ける)?

+0

「dbo」スキーマ内には存在しません。あなたのバッチ内で一時的に構築され、そこにしか存在しません。したがって、 'dbo。[CTE]'を介してそれを扱うことは、そのようなオブジェクトが存在しないために機能しません。 – Adwaenyth

+0

ちょうど 'SELECT * FROM CTE'を試してください - CTEはインラインメモリ内のオブジェクトなので、スキーマには格納されません.... –

+0

テーブル名は実際に' dbo。[TableName] 'you ' 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

はい!これは私が後にしたものです、ありがとうございます。 – Sandman

関連する問題