2013-08-29 52 views
5

Tôi đang viết một thủ tục được lưu trữ trong SQL Server 2005, tại điểm đã cho, tôi cần phải thực hiện một thủ tục được lưu trữ khác. gọi đây là năng động, và do đó, tôi đã sử dụng lệnh sp_executesql như thường lệ:sp_executesql và đầu ra bảng

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 

Nhưng tôi nhận được lỗi này:

Must declare the scalar variable "@tempTable".

Như bạn có thể thấy biến được khai báo. Tôi đã đọc số documentation và dường như chỉ có các tham số được phép là văn bản, ntext và hình ảnh. Làm thế nào tôi có thể có những gì tôi cần?

PS: Tôi đã tìm thấy nhiều mẹo cho năm 2008 và phiên bản tiếp theo, bất kỳ cho năm 2005.

+1

được một lúc kể từ năm 2005, nhưng phạm vi các @ temptable là giới hạn đối với các thủ tục hiện hành, không phải là thủ tục executeSQL ... – Sparky

+2

nó không có bất cứ điều gì để làm với sp_executesql. nó phải làm với phạm vi của một biến bảng. điều tiếp theo để nghĩ đến sẽ là sử dụng một bảng tạm thời, nhưng tôi khá chắc chắn rằng nó sẽ thất bại quá bởi vì sp_executesql chạy trên một thread khác nhau –

Trả lời

4

giải quyết, nhờ tất cả cho lời khuyên:

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

Điều này không làm việc cho tôi vào năm 2008!?! #tempTable không được cập nhật trong phạm vi cục bộ từ 'EXEC()'. – Campbeln

1

@ phạm vi của tempTable bị giới hạn trong quy trình hiện tại.

Bạn có thể thay thế @tempTable với một bảng tạm thời toàn cầu (tức là ## bảng), nhưng phải rất cẩn thận với phạm vi của bảng đó và hãy chắc chắn để thả nó khi các thủ tục kết thúc