2013-08-29 126 views
5

我正在寫SQL Server 2005中的存儲過程,在給定點我需要執行另一個存儲過程。這種調用是動態的,所以我用sp_executesql的命令和往常一樣:sp_executesql和表輸出

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 

但我得到這個錯誤:

Must declare the scalar variable "@tempTable".

正如你可以看到,變量聲明。我已閱讀documentation,似乎只允許參數是文本,ntext和圖像。我怎麼能得到我需要的東西?

PS:我發現很多的技巧在2008年和進一步的版本,任何於2005年

+1

從2005年開始了一段時間,但@不是Temptable的範圍僅限於當前的程序,而不是程序的ExecuteSQL ... – Sparky

+2

它沒有任何與sp_executesql的。它必須處理表變量的範圍。接下來要考慮的是使用臨時表,但我確信它也會失敗,因爲sp_executesql運行在不同的線程上。 –

回答

4

解決了,感謝所有的提示:

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

這在2008年對我來說不起作用!?! #tempTable不會在EXEC()的本地作用域中更新。 – Campbeln

1

@不是Temptable的範圍僅限於當前過程。

你可以用全局臨時表(即##表)更換@tempTable,但要非常小心,與該表的範圍和一定砸在過程結束