2011-11-07 15 views
25

Stavo provando a selezionare ... in una tabella temporanea #TempTable in sp_Executedsql. Non è stato inserito correttamente o no ma ci sono messaggi scritti (359 righe (s) interessate) che significa inserito correttamente? Script sottoEsegui sp_executeSql per selezionare ... in #table ma Impossibile selezionare i dati della tabella temporanea

DECLARE @Sql NVARCHAR(MAX); 
SET @Sql = 'select distinct Coloum1,Coloum2 into #TempTable 
      from SPCTable with(nolock) 
      where Convert(varchar(10), Date_Tm, 120) Between @Date_From And @Date_To'; 

SET @Sql = 'DECLARE @Date_From VARCHAR(10); 
      DECLARE @Date_To VARCHAR(10); 
      SET @Date_From = '''+CONVERT(VARCHAR(10),DATEADD(d,DATEDIFF(d,0,GETDATE()),0)-1,120)+'''; 
      SET @Date_To = '''+CONVERT(VARCHAR(10),DATEADD(d,DATEDIFF(d,0,GETDATE()),0)-1,120)+'''; 
      '+ @Sql; 

EXECUTE sp_executesql @Sql; 

Dopo eseguito, la sua mi ritorno sui messaggi (359 row (s) affected). Avanti quando si tenta di selezionare i dati da #TempTable.

Select * From #TempTable; 

Its me tornare:

Msg 208, Level 16, State 0, Line 2 
Invalid object name '#TempTable'. 

Sospettato solo il suo solo la sezione di lavoro 'selezionare'. L'inserto non funziona. come aggiustarlo?

risposta

25

locale tabella temporanea #table_name è visibile nella sessione corrente, globali temporanei ##table_name tabelle sono visibili in tutte le sessioni. Entrambe le vite fino alla loro sessione è chiusa. sp_executesql - crea la propria sessione (forse la parola "scope" sarebbe meglio), ecco perché succede.

+2

Credo che la parola "scope" sarebbe meglio. 'DECLARE @sql NVARCHAR (MAX); SET @sql = 'SELECT @@ SPID'; EXECUTE sp_executesql @sql; SELECT @@ SPID' –

+0

Grazie a @Michal, ho già ricordato questo metodo di utilizzo. Grazie ancora – Worgon

+0

La domanda era come risolverlo. Non perché la sua rottura. Ho fornito la risposta corretta qui sotto. 'INSERISCI IN @tmpTbl EXEC sp_executesql @ sql' –

3

Le tabelle temporanee vivono solo fino alla connessione che le crea. Mi aspetto che tu stia eseguendo involontariamente la selezione su una connessione separata. Puoi verificarlo inserendo momentaneamente il tuo inserto in una tabella non temporanea e verificando se i tuoi dati sono presenti. In tal caso, è possibile tornare alla soluzione originale e assicurarsi di passare l'oggetto di connessione alla selezione.

29

L'utilizzo di una tabella temporanea globale in questo scenario potrebbe causare problemi poiché la tabella potrebbe esistere tra le sessioni e potrebbe causare alcuni problemi nell'utilizzo del codice chiamante in modo asincrono.

Una tabella locale temporanea può essere utilizzata se definita prima di chiamare sp_executesql ad es.

CREATE TABLE #tempTable(id int); 

sp_executesql 'INSERT INTO #tempTable SELECT myId FROM myTable'; 

SELECT * FROM #tempTable; 
1

Per aggirare il problema, utilizzare un comando CREATE TABLE #temptable primo per generare una tabella temporanea vuota prima di eseguire sp_executesql. Quindi esegui INSERT INTO #TEMPTABLE con sp_executesql. Questo funzionerà. Questo è il modo in cui ho risolto questo problema perché ho una configurazione in cui tutte le mie query vengono solitamente eseguite tramite sp_executesql.

1
declare @sql varchar(1000) 
set @sql="select * into #t from table;" 
set @sql [email protected] + "select * from #t;" 

execute SP_EXECUTESQL @sql 
4

nella stringa di @sql, non inserire into #TempTable. Invece, chiama la tua istruzione SELECT senza una dichiarazione INSERT.

Infine, inserire i risultati nella vostra tabella temporanea in questo modo:

INSERT INTO @tmpTbl EXEC sp_executesql @sql 
Problemi correlati