2017-09-02 2 views
0

複数のテーブル(MainTbl)から選択しますが、結果セット(StateTbl)に基づいてテーブルが選択されます。ループからのSELECT変数のパスを渡す

MainTables dbo.TABLE_MOdbo.TABLE_CAdbo.TABLE_ALdbo.TABLE_MI

は、あなたを構築する代わりに、あなたはダイナミック活用できるループとStateTblの結果セットStateTbl MOCAWA

Declare @Loop_Count int = 0 
DECLARE @State varchar(2) 
DECLARE @SQL varchar(max) 

DECLARE db_cursor CURSOR FOR SELECT State FROM StateTbl 

OPEN db_cursor 

FETCH db_cursor INTO @State 

WHILE (@@FETCH_STATUS = 0) 
BEGIN 


SET @SQL = 
' 
    dbo.TABLE_'+ @State +' 
' 
EXEC(@SQL) 

SET @Loop_Count = @Loop_Count + 1 
FETCH db_cursor INTO @SQL 

END 
CLOSE db_cursor 
DEALLOCATE db_cursor 
+0

EXEC(@SQL)はテーブルからどのように選択する必要がありますか? '@ SQL'はテーブルの名前だけを含みます。あなたは 'SET @SQL = 'SELECT * FROM dbo.TABLE _' + @State + '''をやってはいけませんか? –

+0

可能重複:https://stackoverflow.com/questions/20054854/tsql-select-from-different-table-based-on-a-case-value –

+0

このためにループは必要ありません。 –

答えて

1

に基づいて引っ張るために探して動的SQL。このようなもの。

declare @SQL nvarchar(max) = '' 

select 'select * from TABLE_' + [State] + ' UNION ALL ' 
from StateTbl 

select @SQL = left(@SQL, len(@SQL) - 10) 

select @SQL 
--uncomment the line below when you satisfied the dynamic sql is written the way you want it. 
--exec sp_executesql @SQL 
+0

レベル6、状態5、行6のメッセージ537をエラーにします LEFTまたはSUBSTRING関数に長さパラメータが渡されました。 – Fonsi

+0

クエリで行が返されますか?私はそれを非常に速く書いて、実際にそれをテストしなかった。返される行がない場合は、間違いなくそのエラーが返されます。 –

+0

行を返しました。今のところ私はそれをストアプロシージャにチューニングし、実行後に挿入を行っています。とにかく、最後の変数 'AAB'をハードコードから切り離し、選択リストを使用します。レコードでレコードを実行する必要があります。 INSERT #RateMeasComp \t EXEC spMeasRateFlo '2'、 'AAB' – Fonsi

関連する問題