2017-10-04 3 views
0

Also habe ich einen Bericht erstellt, der im Wesentlichen eine DML-Anweisung ausführt, die aus mehreren flüchtigen Tabellen erstellt wurde. Die Art, wie ich es gebaut habe, war, dass jede meiner temporären Tabellen im Wesentlichen von der vorherigen abgeleitet werden würde. Zum Beispiel definiere ich in meiner ersten Tabelle den 'Datensatz', während meine anderen temporären Tabellen meine 'Ausschlüsse' definieren, dann kombiniert meine letzte paar temporäre Tabelle alles und führt sie dann in einer abschließenden Abfrage aus.Gespeicherte Prozedur mit mehreren temporären Tabellen erstellen

Ich möchte diesen Bericht automatisieren, um Daten täglich zu ziehen, aber ich bin nicht sicher, ob ein Makro oder sp für es erstellen. Das größere Problem bei beiden Ansätzen ist, wie könnte ich jede temporäre Tabelle effektiv nutzen? Ich habe darüber nachgedacht, ALLE meine Tabellen in eine GIANT (1000+ Zeile) DML-Anweisung zu kombinieren, aber SURELY, es gibt sicher bessere, leichtere Möglichkeiten.

Jede Hilfe wird sehr geschätzt, danke!

+0

Da Sie eine tägliche Datenübernahme erwähnt haben, benötigen Sie möglicherweise keine temporären Tabellen. Möglicherweise können Sie Staging-Tabellen verwenden. Dies sind normale Datenbanktabellen, die nicht Teil eines normalisierten oder Sternschemas sind. Ihr Zweck ist es, mit dem T-Teil eines ETL-Prozesses zu helfen. Anstatt ständig temporäre Tabellen zu erstellen, ersetzen Sie einfach den Inhalt Ihrer Staging-Tabellen. –

+0

Eine andere Alternative wäre die Verwendung globaler temporärer Tabellen. Diese werden beim Zugriff instanziiert, sind sitzungslokal und werden in einem Benutzer-TEMP-Bereich anstelle von SPOOL realisiert. Die Tabellendefinitionen werden im Data Dictionary beibehalten, sodass Sie sie nicht zum Erstellen des Berichts in Ihr gesamtes SQL einbetten müssen. –

Antwort

0

Alternativ können Sie Common Table Expression (CTE) statt temporären Tabellen verwenden:

WITH cte1 AS 
( 
    SELECT * 
    FROM table_1 
    WHERE 
), cte2 AS 
(
    SELECT... 
    FROM cte2 
    JOIN ... 
    WHERE 
) 
... 
SELECT * 
FROM cte_n; 

Ein CTE kann auf vorherigen oder nicht abhängen werden, können Sie auch Rekursion verwenden und Ergebnis in letzter Abfrage kombinieren.

+0

Nach vielen Tests fand ich den CTE am besten geeignet. Wenn jedoch ein Blick von ihm zu schaffen, ich bin nicht sicher, was die Syntax ist, Code unten: CREATE VIEW RECURSIVE db.Test_View AS MIT CTE 3 AS ( SELECT VON CTE 2 ), CTE 2 AS ( FROM CTE SELECT 1 JOIN ... WHERE ... ), CTE 1 AS ( SELECT FROM ... ON JOIN ... WHERE ... ) SELECT * VON CTE3 – WhimsicalWhale

Verwandte Themen