2013-08-29 8 views
5

Ich schreibe eine gespeicherte Prozedur in SQL Server 2005, an einem bestimmten Punkt muss ich eine andere gespeicherte Prozedur ausführen. Dieser Aufruf ist dynamisch, und so habe ich Sp_executesql Befehl wie gewohnt verwendet:sp_executesql und Tabellenausgabe

DECLARE @DBName varchar(255) 
DECLARE @q varchar(max) 
DECLARE @tempTable table(myParam1 int, -- other params) 

SET @DBName = 'my_db_name' 
SET q = 'insert into @tempTable exec ['[email protected]+'].[dbo].[my_procedure]' 
EXEC sp_executesql @q, '@tempTable table OUTPUT', @tempTable OUTPUT 

SELECT * FROM @tempTable 

Aber ich bekomme diese Fehlermeldung:

Must declare the scalar variable "@tempTable".

Wie Sie diese Variable sehen kann, wird erklärt. Ich habe die documentation gelesen und scheint, dass nur Parameter erlaubt sind Text, Ntext und Bild. Wie kann ich haben, was ich brauche?

PS: Ich habe Umfang viele Tipps für das Jahr 2008 und weitere Version, jede für 2005

+1

seit 2005 eine Weile, aber der Umfang des @ TempTable ist das aktuelle Verfahren, nicht die ExecuteSQL Verfahren begrenzt ... – Sparky

+2

es nichts mit sp_executesql zu tun hat. Es hat mit dem Umfang einer Tabellenvariablen zu tun. Das nächste, was ich mir vorstellen würde wäre, eine temporäre Tabelle zu verwenden, aber ich bin mir ziemlich sicher, dass es auch scheitern wird, weil sp_executesql auf einem anderen Thread läuft. –

Antwort

4

gelöst, dank all für Tipps:

DECLARE @DBName varchar(255) 
DECLARE @q varchar(max) 
CREATE table #tempTable(myParam1 int, -- other params) 

SET @DBName = 'my_db_name' 
SET @q = 'insert into #tempTable exec ['[email protected]+'].[dbo].[my_procedure]' 
EXEC(@q) 

SELECT * FROM #tempTable 
drop table #tempTable 
+2

Das funktioniert bei mir nicht für 2008!?! Die #tempTable wird nicht im lokalen Bereich von 'EXEC()' aktualisiert. – Campbeln

1

@ TempTable Wego das aktuelle Verfahren beschränkt ist.

Sie können die @tempTable mit einer globalen temporären Tabelle (dh ## Tabelle) ersetzen, aber sehr vorsichtig sein mit dem Anwendungsbereich dieser Tabelle und sicher sein, es fallen zu lassen, wenn die Prozedur beendet