2009-08-12 7 views
8

ich ein Verfahren geschaffen habenSQL Server zeigt „Ungültige Objektnamen‚#temp‘“, wenn sie mit einer temporären Tabelle arbeiten

create procedure testProcedure_One 
as 
DECLARE @Query nvarchar(4000) 

begin 
SET @Query = 'SELECT * into #temptest FROM Table1' 

Exec sp_Executesql @query 

SELECT * FROM #temptest 
drop table #temptest 
end 

Wenn ich die Prozedur ausführen testProcedure_One ich die Fehlermeldung immer bin:

Invalid object name '#temp' 

Aber wenn ich ##temp means verwenden es funktioniert:

create procedure testProcedure_two 
as 
DECLARE @Query nvarchar(4000) 

begin 

SET @Query = 'SELECT * into ##temptest FROM Table1' 


Exec sp_Executesql @query 

SELECT * FROM ##temptest 
drop table ##temptest 
end 

testProcedure_two adaequat

Was könnte das Problem sein? Wie kann ich es lösen?

Antwort

12

Vermutlich haben Sie folgenden Code, der SELECT von #temp, geben Sie den Fehler?

Es liegt am Umfang. ## temp ist eine globale temporäre Tabelle, die in anderen Sitzungen verfügbar ist. #temp ist eine "lokale" temporäre Tabelle, auf die nur der aktuell ausgeführte Bereich zugreifen kann. sp_executesql wird in einem anderen Bereich ausgeführt, sodass die Daten in #temp eingefügt werden. Wenn Sie jedoch versuchen, auf diese Tabelle außerhalb des Aufrufs sp_executesql zuzugreifen, wird sp_executesql nicht gefunden.

z.B. Diese Fehler wie #Test erstellt und nur sichtbar, der sp_executesql Kontext:

EXECUTE sp_executesql N'SELECT 1 AS Field1 INTO #Test' 
SELECT * FROM #Test 

Die oben genannten Arbeiten mit ##-Test, da es eine globale temporäre Tabelle erstellt.

Dies funktioniert, da die SELECT Teil des gleichen Bereichs ist.

EXECUTE sp_executesql N'SELECT 1 AS Field1 INTO #Test; SELECT * FROM #Test' 

Meine Fragen wären:

  1. Haben Sie wirklich temporäre Tabellen verwenden müssen, können Sie keine Lösung finden, ohne sie zum Beispiel unter Verwendung von eine Unterabfrage?
  2. Müssen Sie SQL mit sp_executesql wirklich ausführen?
+0

Thanks.Ich weiß, es war außerhalb des Geltungsbereichs, aber es traf mich nicht, dass ich die Auswahl mit der gleichen Abfrage tun muss. – Jebli

1

für Sie auszuführen, ich denke, dass die # tmp_table zuerst mit einer ddl-Anweisung erstellt werden sollte.

Dann führen Sie Ihre exec und die gespeicherten Proc, die Sie in der exec erstellt haben, sollte den gleichen Namen temp table viz.#tmp_table haben.

0

die temporäre Tabelle erstellen, indem TABLE CREATE und dann INSERT INTO verwenden, um die Werte anstelle von SELECT INTO einzufügen.

Dies behebt das Problem für mich.

Verwandte Themen