2013-10-24 7 views
9

Ich habe eine gespeicherte Prozedur und einen Teil von ihnen, wie unten: @DRange ist ein eingehender varchar WertMit temporärer Tabelle mit exec @sql in gespeicherte Prozedur

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 

Das Problem ist, wenn ich die gespeicherte Prozedur ausführen, eine Fehlermeldung tritt auf: Kann das Objekt "#tmpA" nicht finden, da es nicht existiert oder Sie keine Berechtigungen haben.

Ist es nicht möglich, temporäre Tabelle zu verwenden und auszuführen oder habe ich etwas falsch gemacht?

+1

Warum verwenden Sie dynamisches SQL? Kannst du nicht eine normale Abfrage haben? Wähle * in #tmpA aus TableA wo create_date> = getDate - @DRange und is_enabled = 1'? Verdeckte @DRange in verschiedenen Typen bei Bedarf –

+0

Weil ich den anderen Parameter wie den Datenbanknamen in die Abfrage kombinieren muss. –

Antwort

7

#tmpA wird in einem anderen Bereich erstellt, ist also außerhalb des dynamischen SQL nicht sichtbar. Sie können einfach den ultimativen SELECT Teil des dynamischen SQL machen. Auch ein paar andere Dinge:

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; 

Natürlich, wenn alle Auswählens du tust, ich habe eine harte Zeit zu verstehen, warum diese dynamische SQL in erster Linie ist. Ich nehme an, Ihre Anfrage (oder was Sie später mit der Temp-Tabelle machen) ist komplizierter als das - wenn ja, blamieren Sie es nicht für uns. Wenn Sie uns Ihr gesamtes Problem mitteilen, wird viel Hin und Her vermieden, da die zusätzlichen Details die Antwort ändern könnten.

+1

Danke für deinen Kommentar, ich benutze ## tmpA anstelle von #tmp und das Problem hat sich gelöst. –

+10

@WilliamTang nein, hat es nicht. Weißt du was #tmpA macht? Dies erstellt eine globale temporäre Tabelle. Raten Sie, was passiert, wenn zwei Benutzer diese gespeicherte Prozedur zur gleichen Zeit ausführen (unabhängig davon, was Ihr Datumsbereich oder Ihre Datenbankparameter sind). –

1

Folgendes würde ich tun.

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 
Verwandte Themen