2017-09-02 74 views
0

我正在尋找從多個表(MainTbl)中選擇,但它將基於哪個表將被拉出的結果集(StateTbl)。在SELECT FROM循環中傳遞變量

MainTables dbo.TABLE_MOdbo.TABLE_CAdbo.TABLE_ALdbo.TABLE_MI

只有尋找拉基於結果集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

取而代之的是循環的,你可以利用動態和StateTbl建立你動態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

我收到錯誤消息537,級別16,狀態5,行6 傳遞給LEFT或SUBSTRING函數的長度參數無效。 – Fonsi

+0

查詢是否返回任何行?我寫得非常快,並沒有真正測試它。如果沒有返回行,肯定會返回該錯誤。 –

+0

它返回行。現在我已經將它轉儲到存儲過程並在執行後執行插入操作。無論如何,從硬代碼轉變最後一個變量'AAB'並使用選擇列表。它仍然需要按記錄運行記錄。插入#RateMeasComp \t EXEC spMeasRateFlo'2','AAB' – Fonsi