![]() |
temporäre Tabelle in MS SQL Server
Hallo,
ich habe folgendes Problem: Ich möchte über Delphi eine temporäre Tabelle in MS SQL Server erzeugen. Das mache ich wie folgt:
Delphi-Quellcode:
Das blöde ist: Die Tabelle ist hinterher nicht mehr vorhanden. Auch wenn ich die gleiche TADOQuery verwende und nach dem ExecSQL z.B. folgendes schreibe:
with TADOQuery.Create(WPDataModule) do
try Connection := WPDataModule.Connection; SQL.Clear; SQL.Add('SELECT * INTO #TempTable FROM MyTable'); ExecSQL; finally Free; end;
Delphi-Quellcode:
Auch dann ist die temporäre Tabelle schon weg. Nur wenn ich sowohl den SELECT- als auch den DROP-Befehl in die SQL-Eigenschaft packe und dann erst ExecSQL aufrufe, ist die Tabelle beim zweiten Befehl noch sichtbar.
SQL.Clear;
SQL.Add('DROP TABLE #TempTable'); ExecSQL; Für private, temporäre Tabellen (also die, die bei MS SQL Server mit einem # beginnen) gilt, dass NUR die Verbindung, die die Tabelle angelegt hat, auch auf die Tabelle zugreifen kann. Offenbar beendet Delphi die Verbindung also sofort nach dem ExecSQL. Frage: Gibt es eine Möglichkeit, die Verbindung offen zu halten? Welche Möglichkeit(en) gibt es sonst? Marcus |
Re: temporäre Tabelle in MS SQL Server
niemand? das muß doch bei anderen datenbanken ähnlich sein - oder gibt es dort keine privaten, temporären tabellen?
man könnte die tabelle auch direkt in der tempdb anlegen - sie würde dann nicht #TempTable heißen, sondern tempdb.dbo.TampTable. Aber diese Tabelle ist nicht privat, d.h. jeder kann sie sehen und ich muß sie auf jeden fall löschen. Bricht das Programm vor dem löschen ab, dann müßte ich sie entweder per hand löschen, oder vor dem erstellen prüfen ob es diese tabelle gibt und sie dann löschen. Leider gibt die Methode TADOConnection.GetTableNames aber nur die Namen der Tabellen der aktuellen DB zurück - und tempdb.dbo.TempTable liegt in tempdb... Außerdem frage ich mich, ob Tabellen in tempdb überhaupt schneller sind als "richtige" temporäre Tabellen? |
Re: temporäre Tabelle in MS SQL Server
Ich denke mal es liegt an den ADO Komponenten und das nach dem Ausführen Deiner Query die Connection zur Datenbank geschlossen wird. Und der SQL Server löscht die Temp-Tabellen halt beim Trennen der Verbindung...
Mein Vorschlag: Nimm die Open Source Zeos Komponenten, damit sollte das Problem nicht auftauchen. Als kommerzielle Alternative gibt es z.b. auch SQLDirect, womit ich sehr zufrieden bin. Gruß, Marcel |
Re: temporäre Tabelle in MS SQL Server
Moin moin
Aus der MS-SQL hilfe: Zitat:
schönen Gruß Sam btw. das frühe pushen (<24h) gibt warscheinlich mecker ;-) |
Re: temporäre Tabelle in MS SQL Server
Ich hab soeben das Flag TADOConnection.KeepConnection entdeckt und dachte das wäre die Lösung - das stand aber schon vorher auf TRUE. Dann habe ich das Flag State abgefragt, und das enthält nur stOpen (laut Hilfe bedeutet das "Connection object is inactive, but connected to a database."). Leider hat die TADOConnection aber kein Active-Flag. Wahrscheinlich würde es reichen, die Connection aktiv zu halten - das klappt aber auch nicht mit einem Trick (ich habe versucht eine Abfrage zu öffnen und einfach offen zu halten... nützt nichts - State ist trotzdem stOpen und nicht stExecuted).
Zu BluesKid: Wie finde ich raus welche Version die DB hat? |
Re: temporäre Tabelle in MS SQL Server
Sorry, ich glaub das war totaler Quatsch was ich dir da geposted hab :angle2:
|
Re: temporäre Tabelle in MS SQL Server
Zitat:
SQL-Code:
Gruß,
select @@version
Marcel |
Re: temporäre Tabelle in MS SQL Server
Hallo,
schon mal probiert alles über Transaktionen zu steuern. soweit ich weiss, wird in Delphi standrdmässig vor jedem Aufruf von ExecSQL eine Transaktion gestartet, welche bei beenden der Stored Procedure beendet wird. Du kannst aber auch die Kontrolle selbst übenehmen mit Database.StartTransaction und Database.Commit... Habs aber nicht probiert. Gruß, Tom |
Re: temporäre Tabelle in MS SQL Server
Wen's interessiert: Ich habe die Lösung jetzt gefunden:
- Entweder ich erstelle die Tabelle nicht mit TADOQuery sondern direkt mit der Execute-Methode der Connection - oder ich erweiter den ConnectionString um 'OLE DB Services=-2;'. Die Lösung habe ich gefunden unter ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz