2009-05-14 11 views
2

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!

Antwort

5

Ich habe keine Zeit, dies bis zu verspotten, so dass ich weiß nicht, ob es funktionieren, aber versuchen Sie Ihren Tisch Aufruf ‚## mytemptable‘ anstelle von ‚#mytemptable‘

Ich bin Ihr Problem ist, dass Ihre Tabelle nicht mehr im Geltungsbereich ist, nachdem Sie die SQL-Zeichenfolge exec() ausgeführt haben. Temp-Tabellen, denen zwei Pfund-Symbole vorangestellt sind, sind global zugänglich.

Vergessen Sie nicht, es fallen zu lassen, wenn Sie damit fertig sind!

+0

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

+0

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. :) –

+0

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

2

Die Art, wie ich das in der Vergangenheit getan habe, war: Erstellen Sie zuerst die #temp_table mit CREATE TABLE. Zweitens, erstellen Sie die dynamische Abfrage wie üblich Einfügen in die #temp_table Drittens, verwenden Sie exec sp_executesql @sql.

Mit dieser Methode benötigen Sie nicht den globalen Bereich ## temp_table.

2

Sie können es im gleichen Umfang einschließlich des gesamten Skript in der dynamischen Abfrage:

DECLARE @strSQL nvarchar(max) 
DECLARE @file varchar(100) 

SET @file='c:\myfile.xls' 
SET @strSQL=N'SELECT * INTO #mytemptable FROM OPENROWSET(''Microsoft.Jet.OLEDB.4.0'', ''Excel 8.0;Database='[email protected]+';HDR=YES'', ''SELECT * FROM [Sheet1$]'');' 
SET @[email protected]+N'SELECT * FROM #mytemptable' 

EXECUTE sp_executesql @strSQL 
Verwandte Themen