loop mit UNION t-sql verwenden

Ich habe die Notwendigkeit, mehrere Tabellen mit ähnlichen data abzufragen, aber ich möchte keine lange UNION-statement schreiben. Auch die Anzahl der Tabellen kann variieren. Derzeit mache ich das mit Coldfusion durch:

  1. Looping über eine list von Tablennamen
  2. Durchführung der UNION innerhalb der loop

So was

set i = 0 set table_suffixes = "blue,green,red,yellow" loop list="table_suffixes" index="idx_suffix" set tName = "table_" & idx_suffix if i > 0 UNION end if select * FROM tName end loop 

Kann man das in T-SQL machen? Ich habe keine Artikel über die Verwendung einer list gefunden, um eine loop zu steuern. Das nächste, was ich finden könnte, wäre, eine Abfrage in die loop zu stellen. So was

 While (SELECT table_suffix FROM vendor_name WHERE discipline = 'electrical') BEGIN *union query...* END 

Jede Hilfe, um mich in die richtige Richtung zu zeigen, wird sehr geschätzt. Ich verwende SQL-server 2008

Obwohl generell noch empfohlen, hier ist ein Beispiel für die Generierung und Ausführung von dynamischen SQL in T-SQL.

Ich habe UNION ALL . Sie sollten die Unterschiede zwischen diesem und UNION verstehen

Sobald Sie diese Arbeit haben, können Sie sie in eine gespeicherte Prozedur einpacken, die einen Parameter akzeptiert, der für DISCIPLINE

Bitte beachten Sie auch, dass die Tatsache, dass Sie dies tun müssen, impliziert, dass Sie einige ernsthafte Designerrors in Ihrer database haben.

 DECLARE @TableName VARCHAR(100) DECLARE @DSQL VARCHAR(4000) SET @DSQL = '' DECLARE cTableList CURSOR FOR SELECT table_suffix FROM vendor_name WHERE discipline = 'electrical' OPEN cTableList FETCH NEXT FROM cTableList INTO @TableName WHILE @@FETCH_STATUS = 0 BEGIN SET @DSQL = @DSQL + 'SELECT * FROM ' + @TableName + ' UNION ALL ' END CLOSE cTableList DEALLOCATE cTableList -- Remove the last UNION ALL IF LEN(@DSQL) > 11 SET @DSQL = LEFT(@DSQL,LEN(@DSQL) - 11) -- Print it out for debugging purposes PRINT (@DSQL) -- Execute it EXEC (@DSQL) 

Probier diese –

Abfrage:

 DECLARE @SQL NVARCHAR(MAX) SELECT @SQL = STUFF(( SELECT CHAR(13) + 'UNION ALL' + CHAR(13) + 'SELECT * FROM [' + s.name + '].[' + o.name + ']' FROM sys.objects o JOIN sys.schemas s ON o.[schema_id] = s.[schema_id] WHERE o.[type] = 'U' FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 11, '') PRINT @SQL 

Ausgabe:

 SELECT * FROM [dbo].[test1] UNION ALL SELECT * FROM [dbo].[MyTable] UNION ALL ... 

In deinem Fall sieht man so etwas –

 DECLARE @SQL NVARCHAR(MAX) SELECT @SQL = STUFF(( SELECT CHAR(13) + 'UNION ALL' + CHAR(13) + 'SELECT * FROM ' + table_suffix FROM vendor_name WHERE discipline = 'electrical' WHERE o.[type] = 'U' FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 11, '') PRINT @SQL