2009-08-12 35 views
8

Tôi đã tạo ra một thủ tụcSQL Server cho thấy "tên đối tượng không hợp lệ '#temp" khi làm việc với một bảng tạm thời

create procedure testProcedure_One 
as 
DECLARE @Query nvarchar(4000) 

begin 
SET @Query = 'SELECT * into #temptest FROM Table1' 

Exec sp_Executesql @query 

SELECT * FROM #temptest 
drop table #temptest 
end 

Khi tôi chạy các thủ tục testProcedure_One Tôi nhận được thông báo lỗi:

Invalid object name '#temp' 

Nhưng nếu tôi sử dụng ##temp means nó làm việc:

create procedure testProcedure_two 
as 
DECLARE @Query nvarchar(4000) 

begin 

SET @Query = 'SELECT * into ##temptest FROM Table1' 


Exec sp_Executesql @query 

SELECT * FROM ##temptest 
drop table ##temptest 
end 

testProcedure_two đang hoạt động tốt

Điều gì có thể là vấn đề? Làm thế nào tôi có thể giải quyết nó?

Trả lời

12

Có lẽ bạn có mã sau CHỌN từ #temp, cho bạn lỗi?

Nó nằm trong phạm vi. ## temp là một bảng tạm thời toàn cầu, có sẵn trong các phiên khác. #temp là bảng "cục bộ" tạm thời, chỉ có thể truy cập bởi phạm vi thực hiện hiện tại. sp_executesql chạy dưới một phạm vi khác nhau, và vì vậy nó sẽ chèn dữ liệu vào #temp, nhưng nếu bạn sau đó cố gắng truy cập vào bảng đó bên ngoài cuộc gọi sp_executesql, nó sẽ không tìm thấy nó.

ví dụ: này lỗi như #Test được tạo ra và chỉ hiển thị cho, bối cảnh sp_executesql:

EXECUTE sp_executesql N'SELECT 1 AS Field1 INTO #Test' 
SELECT * FROM #Test 

Các công trình trên với ## thử nghiệm vì nó tạo ra một bảng tạm thời toàn cầu.

Công trình này, vì SELECT là một phần của cùng một phạm vi.

EXECUTE sp_executesql N'SELECT 1 AS Field1 INTO #Test; SELECT * FROM #Test' 

Câu hỏi của tôi sẽ là:

  1. Bạn có thực sự cần phải sử dụng bảng tạm thời, bạn có thể không tìm thấy một giải pháp mà không có họ sử dụng ví dụ một truy vấn phụ?
  2. Bạn có thực sự cần thực thi sql như thế này bằng cách sử dụng sp_executesql không?
+0

Cảm ơn.Tôi biết nó đã nằm ngoài phạm vi nhưng nó không tấn công cho tôi rằng tôi phải thực hiện lựa chọn với cùng một truy vấn. – Jebli

1

để bạn thực thi tôi nghĩ rằng #tmp_table nên được tạo trước tiên bằng cách sử dụng câu lệnh ddl.

Sau đó, bạn thực hiện exec của bạn và proc được lưu trữ bạn đã tạo trong exec nên có cùng tên là temp table viz.#tmp_table.

0

Tạo bảng tạm thời bằng cách sử dụng CREATE TABLE và sau đó sử dụng INSERT INTO để chèn các giá trị thay vì SELECT INTO.

Điều này đã khắc phục được sự cố cho tôi.

Các vấn đề liên quan