0

J'ai une base de données d'application COTS qui crée une nouvelle table chaque semaine qui suit une convention de dénomination spécifique et contient toujours les mêmes colonnes. J'ai écrit une requête pour sélectionner les tables dans un certain intervalle de temps:SQL Feed Résultats de la requête dans Union All Statement

DECLARE @today VARCHAR(8) 
SET @today = CONVERT(VARCHAR(8),GETDATE(),112) 

DECLARE @monthold VARCHAR(8) 
SET @monthold = CONVERT(VARCHAR(8),dateadd(day,-31,@today),112) 

SELECT name 
FROM sys.tables 
WHERE name <= 'Event_Audit'+ @today AND name >= 'Event_Audit'+ @monthold 
AND name like 'Event_Audit%' 
ORDER BY name DESC 

Maintenant, je suis à la recherche d'un moyen d'avoir un appel de requête chacune des tables qui est sélectionnée pour agréger les données. Cela sera utilisé pour les rapports SSRS.

Quelque chose comme ça où table1, table2, etc. à travers toutes les tables incluses va se peuplé (que ce soit 4, 5 ou plus):

SELECT * 
FROM table1 
UNION ALL 
SELECT * 
FROM table2 
UNION ALL 
... 
ORDER BY EVENT_DATE DESC 

Je ne peux pas créer des vues, de nouvelles tables ou apporter des modifications aux tables existantes.

+1

Vous aurez besoin d'utiliser SQL dynamique, mais quel est le problème réel que vous avez? Avez-vous essayé d'utiliser sp_executesql? –

+0

J'essayais d'utiliser T-SQL. Je ferai d'autres lectures sur SQL dynamique et sp_executesql. – CPickler

+0

Tous les articles que j'ai vus jusqu'à présent font référence à la création d'une nouvelle table ou d'une table temporaire que je ne peux pas faire. Les comptes ont uniquement un accès en lecture à la base de données SQL pour extraire des données de rapport. – CPickler

Répondre

2

Une mauvaise conception conduira à un travail acharné à chaque fois, celui-ci ne fait pas exception. Je suppose que maintenant il est trop tard pour abandonner l'idée de créer la même table encore et encore pour chaque mois.

Vous n'avez pas besoin de créer une nouvelle ou une table temporaire pour exécuter sp_executesql, il vous suffit de générer le script SQL:

DECLARE @today char(8) = CONVERT(char(8),GETDATE(),112), 
     @monthold char(8) = CONVERT(char(8),dateadd(day,-31,GETDATE()),112), 
     @sql nvarchar(max) = '' 



SELECT @Sql = @Sql + ' UNION ALL SELECT * FROM ' + name 
FROM sys.tables 
WHERE name <= 'Event_Audit'+ @today AND name >= 'Event_Audit'+ @monthold 
AND name like 'Event_Audit%' 
ORDER BY name DESC 

SET @SQL = STUFF(@SQL, 1, 11, '') + -- remove the first UNION ALL 
    ' ORDER BY EVENT_DATE DESC' -- add the ORDER BY 

PRINT @Sql 
--EXEC sp_executeSql @Sql 

Une fois que vous avez imprimé le @Sql et vérifié est ok, unremark la Ligne EXEC et exécutez votre script.

+0

Merci, cela a fonctionné parfaitement. Malheureusement c'est un produit COTS donc je n'ai aucun contrôle sur leurs tables de DB. – CPickler