Ich versuche eine gespeicherte Prozedur zu schreiben, die eine Excel-Datei in eine temporäre Tabelle liest, dann einige der Daten in dieser Tabelle massiert und dann ausgewählte Zeilen aus dieser Tabelle in eine permanente Tabelle einfügt.Verwenden von Openrowset zum Lesen einer Excel-Datei in eine temporäre Tabelle; Wie referenziere ich diese Tabelle?
So beginnt es wie folgt aus:
SET @SQL = "select * into #mytemptable FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database="[email protected]+";HDR=YES', 'SELECT * FROM [Sheet1$]')"
EXEC (@SQL)
So viel scheint zu funktionieren.
Allerdings, wenn ich dann so etwas wie dies versuchen:
Select * from #mytemptable
Ich erhalte eine Fehlermeldung:
Ungültige Objektnamen '#mytemptable'
Warum nicht #mytemptable erkannt wird ? Gibt es eine Möglichkeit, #mytempTable für den Rest der gespeicherten Prozedur zugänglich zu machen?
Vielen Dank im Voraus!
Lunchy - das funktioniert perfekt - vielen Dank! Was passiert jedoch, wenn zwei oder mehr Benutzer den gespeicherten Proc gleichzeitig ausführen? Hat die Tatsache, dass ## mytemptable einen globalen Bereich hat, Probleme? Oder erstellt SQL Server unterschiedliche Instanzen, obwohl die temporären Tabellen denselben Namen haben? – mattstuehler
Ja, sie werden kollidieren, also musst du einen Weg finden, das zu vermeiden, und leider habe ich nicht viele gute Ratschläge, wie das geht. Ich verstehe, dass Sie diese Zeichenfolge ausführen müssen, weil Sie den Dateinamen in die Abfrage verketten, aber ist das wirklich notwendig? Wenn Sie das vermeiden können, ist das kein Problem, da Sie die Abfrage ohne exec() ausführen und zur Verwendung einer temporären Tabelle mit lokalem Bereich zurückkehren können. Meiner Erfahrung nach führt die Ausführung von Strings immer zu Schmerzen. :) –
Lunchy - nochmals vielen Dank. Leider bin ich mir nicht sicher, wie ich die exec() umgehen soll, da der Dateiname immer anders sein wird. Die Verwendung einer globalen temporären Tabelle ist ebenfalls nicht möglich, da es möglich ist, dass mehr als ein Benutzer diese gespeicherte Prozedur gleichzeitig aufruft. Ich habe auch überlegt, eine Tabellenvariable anstelle einer temporären Tabelle zu verwenden, aber ich möchte die Tabellenstruktur nicht im Voraus definieren - ich möchte, dass diese dynamisch ist und aus der Excel-Tabelle kommt. Also, zurück zu Platz 1, denke ich ... – mattstuehler