2013-10-24 17 views
9

Ho una procedura immagazzinata e parte di essi, come di seguito: @DRange è un valore varchar entranteUso tabella temporanea con @sql exec nella procedura immagazzinata

declare @sql varchar(max) 
set @sql = 'select * into #tmpA from TableA where create_date >= getDate - ' + @DRange + '' and is_enabled = 1' 

exec (@sql) 

select * from #tmpA 

Il problema è quando eseguire la stored procedure, si verifica un messaggio di errore: Impossibile trovare l'oggetto "#tmpA" perché non esiste o non si dispone delle autorizzazioni.

Non è possibile utilizzare la tabella temporanea ed eseguirla o ho fatto qualcosa di sbagliato?

+1

Perché si utilizza SQL dinamico? Non puoi avere una normale query 'select * in #tmpA da TableA dove create_date> = getDate - @DRange e is_enabled = 1'? Covert @Diaggi in altro tipo se necessario –

+0

Perché dovrò combinare l'altro parametro, come il nome del database nella query. –

risposta

7

#tmpA viene creato in un ambito diverso, quindi non è visibile al di fuori dell'SQL dinamico. È possibile rendere l'ultima SELECT una parte dell'SQL dinamico. Anche un paio di altre cose:

DECLARE @sql NVARCHAR(MAX); 

SET @sql = N'select * into #tmpA from dbo.TableA 
    where create_date >= DATEADD(DAY, [email protected], GETDATE()) 
    AND is_enabled = 1; SELECT * FROM #tmpA'; 

EXEC sp_executesql @sql, N'@DRange INT', @DRange; 

Naturalmente se tutto quello che stai facendo è la selezione, ho difficoltà a capire il motivo per cui questo è SQL dinamico, in primo luogo. Presumo che la tua query (o ciò che farai in seguito con la tabella temporanea) sia più complicata di così - in caso affermativo, non farla sottovalutare per noi. Dicendoci tutto il tuo problema preverrà un sacco di avanti e indietro, poiché i dettagli aggiuntivi potrebbero cambiare la risposta.

+1

Grazie per il tuo commento, ho usato ## tmpA invece di #tmp e il problema è risolto. –

+10

@WilliamTang no, non è così. Sai cosa ## tmpA fa? Questo crea una tabella temporanea GLOBAL. Indovina cosa succede quando due persone eseguono questa stored procedure contemporaneamente (indipendentemente dall'intervallo di date o dai parametri del database). –

1

Ecco cosa farei.

declare @sql varchar(max) 

set @sql = 'select * from TableA where create_date >= getDate - ' + @DRange + '' and is_enabled = 1' 

Select * Into #tmpA from TableA where create_date = '01/01/1000' -- to create a blank table 

insert into #tmpA 

exec (@sql) 

select * from #tmpA 
Problemi correlati