fred666
Goto Top

SQL Temporäre Tabellen abfragen

Verwendet wird SQL 2005

Hey zusammen,

ich habe eine Frage zu temporären Tabellen!!

Und zwar habe ich eine Stored Procedure welche mir eine Temp. Tabelle erstellt und diese füllt.

Wenn ich nun in einer Query (der gleichen Datenbank) die Stored Procedure ausführe und danach auf Daten der TempTabelle zugreifen möchte bekomme ich den Fehler:

<Invalid object name '#TempTestTabelle'>

Mein Aufruf sieht folgendermaßen aus:

 USE NORTHWIND
EXEC dbo.USP_TempTabelle        --Hier wird #TempTestTabelle erzeugt
--nun auf diese Daten zugreifen
SELECT Spalte1, Spalte3 FROM #TempTestTabelle

Was muss ich tun, damit ich mit der Temp. Tabelle in anderen Querys arbeiten kann?!?

Danke und Grüße
Fred

Content-ID: 169884

Url: https://administrator.de/contentid/169884

Ausgedruckt am: 22.11.2024 um 22:11 Uhr

Biber
Biber 17.07.2011 um 19:48:46 Uhr
Goto Top
Moin Fred666,

  • eine in einer Stored Procedure angelegte lokale temporäre Tabelle (Präfix "#") ist nur innerhalb der StP inclusive evtl aufgerufener Unter-stored procedures sichtbar.
  • eine irgendwo, z.B. in einer Stored Procedure angelegte globale temporäre Tabelle (Präfix "##") ist innerhalb der gesamten Session sichtbar.

-> also entweder globale TempTables anlegen
-> oder alles (auch deine Queries) in einer erweiterten StP abfackeln.

Grüße
Biber
Fred666
Fred666 17.07.2011 um 21:38:49 Uhr
Goto Top
Hi Biber,

okey danke für die Infos! .... das mit dem global hab ich versucht aber nicht ganz geklappt. werde wohl oder übel unterUSP aufrufen müssen!!


Greez und danke
Fred!!
Biber
Biber 17.07.2011 um 22:39:25 Uhr
Goto Top
Moin Fred666,

hab ich versucht aber nicht ganz geklappt..
-> Gilt hier nicht im Forum.

Eventuell hilft es schon, wenn du die Tabellen beim SELECT (also nach dem CREATE und Befüllen durch die StP) mit voll qualifiziertem Namen ansprichst.

Also
SELECT whatever1, whatever2 FROM tempdb.dbo.##TempTestTabelle
 

Und es muss natürlich in derselben Session sein.

Grüße
Biber
Fred666
Fred666 18.07.2011 um 08:34:05 Uhr
Goto Top
Hi...

okey! ... nehme ich zur Kenntniss^^ .... Also ich habe es so probiert wie du meintest:
Habe in einer Query eine ##TempTabelle angelegt und in einer anderen darauf zugegriffen. Hat geklappt.
ABER: wenn ich in einer Query eine ##TempTabelle anlege, diese Querry schließe und in einer neuen Query darauf zugreifen möchte geht das nicht mehr!!

Das war mit dem"versucht aber nicht geklappt" gemeint!! face-smile

EDIT: Also wenn ich das über eine USP mache, dann ist die ##TempTable bearbeitbar aber nur solange wie das Fenster welches die USP aufrief offen ist!! Wenn ich dieses Fenster schließe, welches die USP aufruft dann ist auch die Tabelle weg! face-sad

weitere Frage: wie sicher bzw. erstrebenswert ist es globale Temp Tabellen zu verwenden?? Gibt es da irgendwelche risiken oder ähnliches das man beachten sollte?!?

Grüße Fred
MadMax
MadMax 18.07.2011 um 13:01:50 Uhr
Goto Top
Moin,

temporäre Tabellen werden gelöscht, sobald die SP, durch die sie angelegt wurde, beendet wird. Ob lokal oder global ist egal, wenn USP_TempTabelle beendet wird, ist die Tabelle weg. Was funktioniert ist, wenn die temporäre Tabelle erst erstellt wird, dann in der Unterprozedur USP_TempTabelle die Tabelle befüllt wird und dann der Inhalt weiterverarbeitet wird. Nicht die schönste Art, aber anders gehts nicht (wenn doch, dann wäre ich auch für eine sinnvolle Alternative dankbar face-smile ).

Der Nachteil von globalen Tabellen ist einfach der: Wenn mehrere Benutzer ein Programm bedienen und erst Benutzer A die globale Tabelle anlegt und anschließend Benutzer B dieselbe Prozedur aufruft und auch die Tabelle anlegen will, dann bekommt der einen Fehler. Die temporäre Tabelle von Benutzer A sollte er auch nicht verwenden, weil er ja nicht weiß, wann der die Tabelle wieder löscht.

Bis jetzt habe ich noch keine sinnvolle Verwendung in einem Programm für die globale Tabelle gefunden. Einzig, wenn ich im Query Analyzer was teste und von einer anderen Session aus mal einen Wert abfragen will, dann brauche ich die globalen Tabellen, aber das kommt so gut wie nie vor face-smile

Gruß, Mad Max