2010-02-14 4 views
0

Je suis en train d'interroger une base de données (SQL Server) avec plusieurs tables de structure identique et avec des noms apparentés à savoirSQL sélectionnez les enregistrements à partir d'un nombre arbitraire de tables identiques

[TABLE 01 $TRANSACTIONS] 
[TABLE 02 $TRANSACTIONS] 
... 
[TABLE (n) $TRANSACTIONS] 

J'ai une requête qui renvoie les enregistrements souhaités sur une table à la fois et peut sélectionner manuellement plusieurs tables avec

SELECT {QUERY01} FROM [TABLE 01 $TRANSACTIONS] 
UNION 
SELECT {QUERY02} FROM [TABLE 02 $TRANSACTIONS] 
... 
SELECT {QUERY(n)} FROM [TABLE (n) $TRANSACTIONS] 

la requête générique dans laquelle je substitue le nom de table requis est d'environ 200 lignes, comportant une ROWNUMBER()/PARTITION BY fonction multiple se joint aux tables liées et quelques commandes.

Au fil du temps, de nouvelles tables seront ajoutées et n va changer.

Quelqu'un peut-il suggérer une façon de sélectionner l'Union des enregistrements de tous n tables pour des valeurs arbitraires de n?

Note: la liste des n tables peut être facilement obtenue avec une requête sur la table sysobjects

SELECT Name FROM sysobjects 
WHERE Type = 'U' 
AND Name LIKE '%$TRANSACTIONS' 
ORDER BY Name 
+0

Pourquoi avez-vous des tables identiques avec des noms différents? Avez-vous envisagé de normaliser votre base de données? Cela pourrait rendre votre vie beaucoup plus facile. –

+0

Juste pour clarifier: Je n'ai absolument aucun contrôle sur la conception de cette base de données. Il s'agit d'une implémentation (tierce partie) d'un des systèmes financiers appartenant à Microsoft. – comrade

+0

simplement parce que vous obtenez les données de cette façon ne vous empêche pas de créer une option normalisée .... il vous suffirait de créer vos propres tables normalisées et y mettre les données. – Leslie

Répondre

1

de AFAIK, votre meilleur pari est d'utiliser votre sysobjects requête pour générer une nouvelle définition de la vue périodiquement.

Vous pouvez créer un déclencheur DDL qui exécute la procédure pour régénérer cette vue lorsque vos tables changent - je ne sais pas vraiment. Les conceptions de DB comme ceci sont un trainwreck.

0

Vous pouvez faire un curseur sur votre requête sysobjects et construire l'instruction sql. Ensuite, vous pouvez appeler sp_executesql pour l'exécuter. De l'expérience, je peux vous dire que c'est une peine dans le A $$ à déboguer. Je m'attendrais également à ce que cette solution s'effondre avec n'importe quelle mise à niveau de fournisseur. Bonne chance.

Questions connexes