2017-09-02 2 views
0

Je cherche à sélectionner parmi plusieurs tables (MainTbl) mais cela dépendra de l'ensemble de résultats (StateTbl) des tables à extraire.Transmettre la variable dans SELECT FROM Loop

MainTables dbo.TABLE_MO, dbo.TABLE_CA, dbo.TABLE_AL, dbo.TABLE_MI

recherche uniquement à tirer basé sur resultset StateTbl MO, CA, WA

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

Comment est-ce que 'EXEC (@SQL)' est supposé sélectionner à partir d'une table? '@ SQL' ne contiendra que le nom d'une table. Ne devriez-vous pas faire 'SET @SQL = 'SELECT * FROM dbo.TABLE _' + @State + '''? –

+0

Possible Dupliquer: https://stackoverflow.com/questions/20054854/tsql-select-from-different-table-based-on-a-case-value –

+0

Vous n'avez pas besoin d'une boucle pour cela. –

Répondre

1

Au lieu d'une boucle, vous pouvez tirer parti dynamique et la StateTbl pour construire votre SQL dynamique Quelque chose comme ça.

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

Je reçois erreur Msg 537, niveau 16, état 5, ligne 6 Paramètre de longueur non valide passé à la fonction GAUCHE ou SUBSTRING. – Fonsi

+0

La requête renvoie-t-elle des lignes? J'ai écrit ça très vite et je ne l'ai pas vraiment testé. Il retournerait définitivement cette erreur s'il n'y a pas de lignes retournées. –

+0

Il a retourné des lignes. Pour l'instant je l'ai ajusté dans une procédure de magasin et faire une insertion après une exécution. De toute façon, pour transformer la dernière variable 'AAB' du code dur et utiliser une liste de sélection. Il aurait encore besoin de faire des enregistrements par enregistrement. INSERT #RateMeasComp \t EXEC spMeasRateFlo '2', 'AAB' – Fonsi